Giá trị tối đa và tối thiểu cho ints


745

Tôi đang tìm kiếm các giá trị tối thiểu và tối đa cho các số nguyên trong python. Ví dụ, trong Java, chúng ta có Integer.MIN_VALUEInteger.MAX_VALUE. Có một cái gì đó như thế này trong python?


14
Lưu ý rằng trong Python 3, intkiểu cơ bản giống với longkiểu trong Python 2, vì vậy ý ​​tưởng về mức tối đa hoặc tối thiểu sẽ intbiến mất hoàn toàn. Về cơ bản nó không liên quan ngay cả trên Python 2.
agf

8
@agf: nó có thể có liên quan theo nhiều cách khác nhau. Chẳng hạn, trong bất kỳ thuật toán nào yêu cầu lưu giá trị tối thiểu được tìm thấy (như thuật toán sắp xếp). Giá trị tối thiểu có thể được khởi tạo tại sys.maxint để đảm bảo rằng mọi giá trị đầu tiên được tìm thấy đều được lấy dưới dạng tối thiểu
Basile Perrenoud

@Toaster ngoại trừ việc bạn có thể có một danh sách trong đó tất cả các giá trị đều lớn hơn sys.maxintvì nó chỉ là mức tối đa cho intloại trên Python 2, mà Python sẽ âm thầm quảng bá đến a long.
agf

30
Nếu bạn cần sử dụng "một giá trị rất lớn" trong một thuật toán, ví dụ: tìm tối thiểu hoặc tối đa của một bộ sưu tập chung, float('inf')hoặc float('-inf')có thể khá hữu ích.
geoff

1
Bản sao có thể có của phạm vi số nguyên Python
Waldir Leoncio

Câu trả lời:


853

Con trăn 3

Trong Python 3, câu hỏi này không áp dụng. Các intloại đồng bằng là không giới hạn.

Tuy nhiên, bạn thực sự có thể đang tìm kiếm thông tin về kích thước từ của trình thông dịch hiện tại , sẽ giống với kích thước từ của máy trong hầu hết các trường hợp. Thông tin đó vẫn có sẵn trong Python 3 sys.maxsize, đây là giá trị tối đa có thể biểu thị bằng một từ đã ký. Tương tự, đó là kích thước của danh sách lớn nhất hoặc chuỗi trong bộ nhớ .

Nói chung, giá trị tối đa được biểu thị bằng một từ không dấu sẽ là sys.maxsize * 2 + 1và số bit trong một từ sẽ là math.log2(sys.maxsize * 2 + 2). Xem câu trả lời này để biết thêm thông tin.

Con trăn 2

Trong Python 2, giá trị tối đa cho intcác giá trị đơn giản có sẵn là sys.maxint:

>>> sys.maxint
9223372036854775807

Bạn có thể tính giá trị tối thiểu -sys.maxint - 1như được hiển thị ở đây .

Python liên tục chuyển từ số nguyên sang số nguyên dài khi bạn vượt quá giá trị này. Vì vậy, hầu hết thời gian, bạn sẽ không cần phải biết điều đó.


177
Con số này có thể là tùy ý, nhưng nó không phải là. Chính xác là 9223372036854775807 2^63 - 1, vì vậy bạn đã có int 64 bit. Nói chung, một số nguyên n bit có các giá trị từ -2^(n-1)đến 2^(n-1) - 1.
NullUserException

22
Lưu ý rằng nếu bạn đang sử dụng thời gian chạy Python 32 bit, sys.maxint sẽ quay trở lại 2^31 - 1, mặc dù Python sẽ chuyển sang 64 bit liền mạch với longkiểu dữ liệu.
Scott Stafford

19
Sử dụng sys.maxsizethay thế, như được đề xuất bởi @Akash Rana. Nó cũng có mặt trong Python 2, như các systài liệu nói. Điều này sẽ làm cho mã tương thích hơn với cả hai phiên bản Python.
Ioannis Filippidis

6
Bạn và tôi có những cách hiểu khác nhau về dòng đó từ các tài liệu. Sự thay thế trong 2to3là một heuristic nhanh và bẩn sẽ không phá vỡ bất cứ điều gì hầu hết thời gian - nhưng sự khác biệt giữa hai giá trị này là vấn đề. Thực tiễn tốt nhất là sử dụng giá trị bạn thực sự muốn sử dụng. Nếu bạn thực sự cần sys.maxint trong Python 2, bạn sẽ không cần nó nữa trong Python 3 và nó thực sự cần được xóa hoàn toàn, không thay đổi thành sys.maxsize.
gửi

3
minize - Nhân với toán tử Bitwise min cho minize ~ sys.maxsize
om471987

238

Nếu bạn chỉ cần một số lớn hơn tất cả những người khác, bạn có thể sử dụng

float('inf')

theo cách tương tự, một con số nhỏ hơn tất cả những thứ khác:

float('-inf')

Điều này hoạt động trong cả python 2 và 3.


9
Chỉ là một ghi chú tho (như không liên quan, nhưng vẫn): float ('inf')> float ('inf') dẫn đến 'false'. Số vô hạn phải lớn hơn một số vô hạn khác :-D ... snaps mind
Scre

11
@Scre Bạn còn mong đợi gì nữa? x > xlà thường False, và vô cùng nên không phải là ngoại lệ. ( float('NaN), mặt khác ...)
jamesdlin

6
Điều này thực sự không áp dụng cho intcauze cannot convert infinite float to int... nhưng hoạt động trong hầu hết các trường hợp
Leighton

5
Lưu ý rằng int('inf')không hoạt động.
Tom Hale

4
Đây không phải là câu trả lời cho câu hỏi của OP
ghosh

225

Các sys.maxinthằng số đã bị xóa khỏi Python 3.0 trở đi, thay vì sử dụng sys.maxsize.

Số nguyên

  • PEP 237: Về cơ bản, từ lâu được đổi tên thành int. Đó là, chỉ có một loại tích phân tích hợp, được đặt tên là int; nhưng nó cư xử chủ yếu như kiểu dài cũ.
  • PEP 238: Một biểu thức như 1/2 trả về một float. Sử dụng 1 // 2 để có được hành vi cắt ngắn. (Cú pháp sau đã tồn tại trong nhiều năm, ít nhất là từ Python 2.2.)
  • Hằng số sys.maxint đã bị xóa, vì không còn giới hạn giá trị của các số nguyên. Tuy nhiên, sys.maxsize có thể được sử dụng như một số nguyên lớn hơn bất kỳ danh sách thực tế hoặc chỉ mục chuỗi nào. Nó phù hợp với kích thước số nguyên tự nhiên của nhóm triển khai và thường giống như sys.maxint trong các bản phát hành trước đó trên cùng một nền tảng (giả sử các tùy chọn xây dựng giống nhau).
  • Repr () của một số nguyên dài không bao gồm L kéo dài nữa, do đó, mã mà dải vô điều kiện ký tự đó sẽ cắt đi chữ số cuối cùng thay thế. (Sử dụng str () thay thế.)
  • Chữ Octal không còn thuộc mẫu 0720; sử dụng 0o720 thay thế.

Tham khảo: https://docs.python.org/3/whatsnew/3.0.html#integers


1
Chính xác. Thật vậy, từ help(sys): maxsize - chiều dài lớn nhất được hỗ trợ của container . Đây phải là câu trả lời được chấp nhận.
Marco Sulla

77

Trong số nguyên Python sẽ tự động chuyển từ intbiểu diễn kích thước cố định sang biểu diễn độ rộng thay đổi longmột khi bạn vượt qua giá trị sys.maxint, đó là 2 31 - 1 hoặc 2 63 - 1 tùy thuộc vào nền tảng của bạn. Lưu ý Lrằng được thêm vào đây:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Từ hướng dẫn Python :

Các số được tạo bởi các chữ số hoặc là kết quả của các hàm và toán tử tích hợp. Các số nguyên không được cung cấp (bao gồm số nhị phân, số thập phân và số bát phân) mang lại số nguyên đơn giản trừ khi giá trị mà chúng biểu thị là quá lớn để được biểu diễn dưới dạng số nguyên, trong trường hợp chúng mang lại một số nguyên dài. Chữ nguyên có một 'L'hoặc 'l'hậu tố mang lại số nguyên dài ( 'L'được ưa thích vì 1ltrông quá giống như mười một!).

Python rất cố gắng để giả vờ số nguyên của nó là số nguyên toán học và không bị ràng buộc. Chẳng hạn, nó có thể tính toán một googol dễ dàng:

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

36
Để thêm vào sự nhầm lẫn, Python longkhông giống như Java long- nó gần hơn với BigInteger.
NullUserException

Trong python3, dường như không có Lhậu tố, và nó chỉ int, không long, cho dù số lượng lớn như thế nào.
Eric Wang

39

Đối với Python 3, nó là

import sys
max = sys.maxsize
min = -sys.maxsize - 1

3
trăn 3 không tồn tại. xem stackoverflow.com/questions/13795758/
hàn

34
tốt, python 3 không tồn tại , rất may (!); nhưng sys.maxintkhông tồn tại trong python 3 (tl; dr: " sys.maxinthằng số đã bị xóa (trong python3), vì không còn giới hạn đối với giá trị của các số nguyên. Tuy nhiên,sys.maxsize có thể được sử dụng như một số nguyên lớn hơn bất kỳ danh sách hoặc chuỗi thực tế nào. chỉ mục. " )
michael

2
Tại sao tạo các biến mà bóng tích hợp như min()max() ?
RoadRunner - MSFT

1
Tra cứu nhị phân khen ngợi của 2
netskink

2
min = ~sys.maxsize
Andrew


5

Nếu bạn muốn tối đa cho các chỉ mục mảng hoặc danh sách (tương đương với size_ttrong C / C ++), bạn có thể sử dụng numpy:

np.iinfo(np.intp).max

sys.maxsizeTuy nhiên, điều này cũng giống như lợi thế là bạn không cần nhập sys chỉ cho việc này.

Nếu bạn muốn max cho int int trên máy:

np.iinfo(np.intc).max

Bạn có thể xem các loại có sẵn khác trong doc .

Đối với phao bạn cũng có thể sử dụng sys.float_info.max.


2

Tôi phụ thuộc rất nhiều vào các lệnh như thế này.

python -c 'import sys; print(sys.maxsize)'

Số nguyên tối đa được trả về: 9223372036854775807

Để tham khảo thêm cho 'sys', bạn nên truy cập

https://docs.python.org/3/l Library / sys.html

https://docs.python.org/3/l Library / sys.html # sys.maxsize


1
Không - maxsize đơn giản là chỉ số container lớn nhất có thể. Python sẽ vui vẻ làm việc với các số nguyên 100 chữ số và hơn thế nữa
Tony Suffolk 66
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.