sets
đang được chỉ định một lambda không thực sự phải chấp nhận các yếu tố đầu vào, mà bạn thấy từ cách nó được gọi. Lambdas nói chung hoạt động như các hàm bình thường, và do đó có thể được gán cho các biến như g
hoặc sets
. Định nghĩa của sets
được bao quanh bởi một bộ ngoặc đơn bổ sung không có lý do rõ ràng. Bạn có thể bỏ qua những parens bên ngoài.
Lambdas có thể có tất cả các loại đối số vị trí, từ khóa và đối số mặc định giống nhau mà chức năng bình thường có thể. Số lambda sets
có thông số mặc định có tên là split
. Đây là thành ngữ phổ biến để đảm bảo rằng sets
trong mỗi lần lặp của vòng lặp nhận giá trị của split
tương ứng với lần lặp đó thay vì chỉ là một từ lần lặp cuối cùng trong tất cả các trường hợp.
Không có tham số mặc định, split
sẽ được đánh giá trong lambda dựa trên không gian tên tại thời điểm được gọi. Khi vòng lặp hoàn thành, split
trong không gian tên của hàm bên ngoài sẽ chỉ là giá trị cuối cùng của vòng lặp đó.
Thông số mặc định được đánh giá ngay lập tức khi đối tượng hàm được tạo. Điều này có nghĩa là giá trị của tham số mặc định split
sẽ ở bất kỳ nơi nào trong vòng lặp của vòng lặp tạo ra nó.
Ví dụ của bạn hơi gây hiểu lầm vì nó loại bỏ tất cả các giá trị thực tế của sets
ngoài giá trị cuối cùng, làm cho tham số mặc định thành lambda vô nghĩa. Dưới đây là một ví dụ minh họa những gì sẽ xảy ra nếu bạn giữ tất cả các lambdas. Đầu tiên với thông số mặc định:
sets = []
for split in ['train', 'test']:
sets.append(lambda split=split: split)
print([fn() for fn in sets])
Tôi đã cắt ngắn lambdas để chỉ trả về thông số đầu vào của chúng nhằm mục đích minh họa. Ví dụ này sẽ in ['train', 'test']
, như mong đợi.
Nếu bạn làm điều tương tự mà không có tham số mặc định, sản lượng sẽ được ['test', 'test']
thay vì:
sets = []
for split in ['train', 'test']:
sets.append(lambda: split)
print([fn() for fn in sets])
Điều này là do 'test'
là giá trị của split
khi tất cả các lambdas được đánh giá.
Bạn có chắc chắn mã đó là chính xác không? Nó thực sự kỳ quặc để giữ lại 'bộ' mỗi lần lặp lại. –
Tôi nghĩ đây chỉ là nỗ lực của OP trong việc tạo ra một ví dụ tối thiểu. Mã này không phải là của riêng mình theo câu hỏi riêng của mình. –