Tôi chỉ chơi xung quanh với Python và nhận ra điều gì đó kỳ lạ.
Tôi có chức năng dưới đây:
def myfun(): #f1 return 1 def myfun(): #f2 return 0 print (myfun())Tôi đã thay đổi các giá trị trong f1 và >>> myfun=lambda:1; myfun=lambda:0; print(myfun()) 0 0, nhưng dường như nó luôn luôn in giá trị trả về của ____10. Có một lý do cụ thể?
Đã hỏi ngày 25 tháng 2 năm 2015 lúc 9:56Feb 25, 2015 at 9:56
4
Trong các ngôn ngữ được biên dịch, bạn thường sẽ nhận được một thông báo lỗi nếu bạn cố gắng xác định hai hàm có cùng tên. Nhưng trong các hàm Python là các đối tượng hạng nhất và chúng được xác định một cách linh hoạt.
Khi bạn xác định một hàm mới có cùng tên với hàm được xác định trước đó, tên hàm hiện được liên kết với đối tượng hàm mới và đối tượng hàm cũ được thu thập lại bởi Trình thu gom rác.
Vì vậy, những gì xảy ra với các chức năng của bạn không khác với những gì xảy ra với các ví dụ số nguyên đơn giản được đăng trong các câu trả lời khác trên trang này.
Tương tự, chúng ta có thể làm điều tương tự với các chức năng được xác định bằng cơ chế >>> myfun=lambda:1; myfun=lambda:0; print(myfun()) 0 2. Ví dụ:
>>> myfun=lambda:1; myfun=lambda:0; print(myfun()) 0Đã trả lời ngày 25 tháng 2 năm 2015 lúc 10:11Feb 25, 2015 at 10:11
PM 2ringPM 2ringPM 2Ring
53.2K5 Huy hiệu vàng79 Huy hiệu bạc171 Huy hiệu đồng5 gold badges79 silver badges171 bronze badges
3
Tại sao điều đó lại kỳ lạ? Decleration hàm thứ hai ghi đè lên thứ nhất, vì vậy vào thời điểm >>> myfun=lambda:1; myfun=lambda:0; print(myfun()) 0 3 chỉ được gọi là >>> myfun=lambda:1; myfun=lambda:0; print(myfun()) 0 0 tồn tại.
Đã trả lời ngày 25 tháng 2 năm 2015 lúc 9:59Feb 25, 2015 at 9:59
WeaselfoxweaselfoxWeaselFox
7.1307 Huy hiệu vàng43 Huy hiệu bạc74 Huy hiệu đồng7 gold badges43 silver badges74 bronze badges
4
Định nghĩa thứ hai khiến tên >>> myfun=lambda:1; myfun=lambda:0; print(myfun()) 0 5 bị ràng buộc với chức năng của nó thay thế liên kết được tạo ra bởi định nghĩa trước đó. Điều này hoàn toàn giống như những gì xảy ra trong:
a = 1 a = 0 print aĐã trả lời ngày 25 tháng 2 năm 2015 lúc 10:02Feb 25, 2015 at 10:02
Dan D.Dan D.Dan D.
71.7K14 Huy hiệu vàng98 Huy hiệu bạc119 Huy hiệu đồng14 gold badges98 silver badges119 bronze badges
2
Hãy để tôi tạo một mô -đun với hai chức năng và thêm nhân tôi gọi mô -đun này là >>> myfun=lambda:1; myfun=lambda:0; print(myfun())
0
6 >>> myfun=lambda:1; myfun=lambda:0; print(myfun())
0
7 bao gồm mã sau: Hãy để tôi tạo một mô -đun khác với hai hàm và tên các hàm là: Thêm và chia. Tôi gọi mô -đun này là >>> myfun=lambda:1; myfun=lambda:0; print(myfun())
0
8 Trong một chương trình khác >>> myfun=lambda:1; myfun=lambda:0; print(myfun())
0
9, tôi nhập hai mô -đun này như sau: Loại tuyên bố nhập khẩu này sẽ loại bỏ sự mơ hồ. Nó hoạt động tốt. Cả hai cuộc gọi chức năng sẽ được thực thi và chúng tôi nhận được kết quả. Ở đây, thông dịch viên sẽ xem xét cái mới nhất, từ a = 1
a = 0
print a
0 Chương trình trên sẽ đưa ra lỗi sau: Ở đây chương trình trên đang xem xét nhập khẩu mới nhất từ a = 1
a = 0
print a
1 Chúng ta phải cẩn thận nếu hai mô -đun có cùng chức năng với các tham số khác nhau trong khi nhập.
I call this module as >>> myfun=lambda:1; myfun=lambda:0; print(myfun())
0
6
from a = 1
a = 0
print a
0