CPython có một giới hạn của 255 đối số được truyền một cách rõ ràng trong một cuộc gọi:
>>> def f(*args, **kwargs): pass
...
>>> exec("f({})".format(', '.join(map(str, range(256)))))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
SyntaxError: more than 255 arguments
Hạn chế này được đặt ra bởi vì cho đến Python 3.5, CALL_FUNCTION
opcode quá tải đối số opcode để mã hóa cả. số đối số vị trí và từ khóa trên ngăn xếp, cả hai được mã hóa trong một byte đơn.
Giới hạn này bị xóa trong bản phát hành Python 3.7 sắp tới, xem issue #27213 và issue #12844; # 27213 reworked CALL_FUNCTION*
họ mã opcodes cho hiệu năng và đơn giản (một phần của 3.6), giải phóng đối số opcode chỉ mã hóa một số đối số duy nhất, và # 12844 loại bỏ kiểm tra biên dịch thời gian ngăn mã với nhiều đối số hơn được biên dịch. Trong 3.7, với EXTENDED_ARG()
opcode, hiện tại có không giới hạn ở tất cả về số lượng đối số bạn có thể chuyển bằng cách sử dụng đối số rõ ràng, lưu số lượng đối số có thể được gắn vào ngăn xếp (do đó bị ràng buộc bởi bộ nhớ của bạn):
>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=7, micro=0, releaselevel='alpha', serial=2)
>>> def f(*args, **kwargs): pass
...
>>> exec("f({})".format(', '.join(map(str, range(256)))))
>>> exec("f({})".format(', '.join(map(str, range(2 ** 16)))))
Do lưu ý rằng danh sách, các bộ và từ điển được giới hạn sys.maxsize
yếu tố, do đó nếu gọi là chức năng sử dụng *args
và/hoặc **kwargs
nhận tất cả các thông số sau đó những là hạn chế.
Đối với cú pháp cuộc gọi *args
và **kwargs
(đối số mở rộng) không có giới hạn nào khác với cùng giới hạn kích thước sys.maxint
về loại tiêu chuẩn Python.
Dường như giới hạn ở bên gọi. Hãy thử exec 'f (' + ','. Tham gia (str (i) cho i trong phạm vi (5000)) + ')' – Brian
"WFM"? WTF? .... –
@Stefan: * Làm việc cho tôi * –