Làm cách nào để khai báo một biến không sử dụng trong vòng lặp for?


87

Nếu tôi có một danh sách dễ hiểu (ví dụ) như thế này:

['' for x in myList]

Tạo một danh sách mới có một chuỗi trống cho mọi phần tử trong danh sách một cách hiệu quả, tôi không bao giờ sử dụng x. Có cách viết nào rõ ràng hơn để tôi không phải khai báo xbiến không sử dụng không ?

Câu trả lời:


130

_ là tên trình giữ chỗ chuẩn cho các thành viên bị bỏ qua trong phép gán vòng lặp và tuple, ví dụ:

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

BTW danh sách của bạn có thể được viết mà không cần hiểu danh sách (giả sử bạn muốn tạo một danh sách các thành viên bất biến như chuỗi, số nguyên, v.v.).

[''] * len(myList)

10
Sau đó phải đi kèm với một cảnh báo lớn rằng nó không hoạt động như mong đợi đối với các đối tượng có thể thay đổi.

5
@Mohit:a=[[]]*4;a[0].append(5);print(a)
kennytm

@Ramy: Mohit đã đăng giải thích nhưng nó đã bị xóa: S Dù sao, hãy kiểm tra Ghi chú 2 trong docs.python.org/py3k/library/… .
kennytm

2
@Ramy, Python duy trì cùng một tham chiếu cho cùng một đối tượng trong bộ nhớ.
Mohit Ranka

Chẳng hạn nếu tôi đang thực hiện các forvòng lặp lồng nhau ? Hoặc nếu bên trong for _ in range(...)tôi muốn nói _, var = f(x)? Nó có bị nhầm lẫn giữa hai _biến không?
Eric Auld,

19

Như Zen đã nói: Các trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc. Trường hợp đặc biệt là các vòng lặp không sử dụng các mục của thứ đang được lặp lại và quy tắc là có một "mục tiêu" để giải nén.

Tuy nhiên, bạn có thể sử dụng _làm tên biến, thường được hiểu là "cố ý không sử dụng" (ngay cả PyLint, v.v. cũng biết và tôn trọng điều này).


Tuy nhiên, PyLint phàn nàn rằng C: 10,24: Invalid variable name "_" (invalid-name)trừ khi bạn thêm nó vào good-namestrong .pylintrc.
giorgiosironi

12

Nó chỉ ra rằng việc sử dụng dummy*(từ bắt đầu là dummy) làm tên biến thực hiện thủ thuật tương tự như _. _là một tiêu chuẩn đã biết và sẽ tốt hơn nếu sử dụng các tên biến có ý nghĩa. Vì vậy, bạn có thể sử dụng dummy, dummy1, dummy_anything. Bằng cách sử dụng các tên biến PyLintnày sẽ không phàn nàn.


Tôi thực sự thích cách tiếp cận này. nó vẫn có ý nghĩa.
RvdK

2

Thêm nhận xét sau sau vòng lặp for trên cùng một dòng:

#pylint: vô hiệu hóa = biến không sử dụng

for i in range(100): #pylint: disable=unused-variable

1

Nếu bạn cần đặt tên cho các đối số của mình (ví dụ: trong trường hợp khi viết mô phỏng không sử dụng một số đối số nhất định được tham chiếu theo tên), bạn có thể thêm phương thức phím tắt này:

def UnusedArgument(_):
  pass

và sau đó sử dụng nó như thế này

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

0

Các đối tượng trình tạo không thực sự sử dụng các biến. Vì vậy, một cái gì đó như

list(('' for x in myList))

nên làm thủ thuật. Lưu ý rằng x không được định nghĩa là một biến bên ngoài khả năng hiểu của trình tạo.


0

Bạn cũng có thể thêm vào trước một tên biến _nếu bạn muốn đặt cho biến một tên có thể đọc được. Ví dụ, bạn có thể sử dụng _foo, _foo1, _anythingvà pylint sẽ không phàn nàn. Trong vòng lặp for, nó sẽ giống như:

for _something in range(10):
    do_something_else()

chỉnh sửa: Thêm ví dụ


0

Một cách dài dòng là:

newList = []
while len(newList) < len(mylist):
    newList.append('')

Bạn tránh khai báo một biến đã sử dụng theo cách này.

Ngoài ra, bạn có thể nối cả các đối tượng có thể thay đổi và bất biến (như từ điển) vào newList.

Một điều khác đối với những người mới chơi python như tôi, '_', 'dummy' có một chút bối rối.


0

Hãy thử nó, nó đơn giản:

# Use '_' instead of the variable
for _ in range(any_number):
    do_somthing()

-1

Nhận xét về Làm cách nào để khai báo một biến không sử dụng trong vòng lặp for? (Đã hết kích thước bình luận)

Python duy trì cùng một tham chiếu cho đối tượng được tạo. (bất kể khả năng thay đổi), ví dụ,

In [1]: i = 1

In [2]: j = 1

In [3]: id(i)
Out[3]: 142671248

In [4]: id(j)
Out[4]: 142671248

Bạn có thể thấy cả i và j, tham chiếu đến cùng một đối tượng trong bộ nhớ Điều gì sẽ xảy ra khi chúng ta thay đổi giá trị của một biến bất biến.

In [5]: j = j+1

In [6]: id(i)
Out[6]: 142671248

In [7]: id(j)
Out[7]: 142671236

bạn có thể thấy j bây giờ bắt đầu trỏ đến một vị trí mới, (nơi 2 được lưu trữ), và tôi vẫn trỏ đến vị trí nơi 1 được lưu. Trong khi đánh giá,

j = j+1

Giá trị được chọn từ 142671248, được tính toán (nếu chưa được lưu trong bộ nhớ đệm) và đặt tại vị trí mới 142671236. j được thực hiện để trỏ đến vị trí mới. Nói một cách đơn giản hơn, một bản sao mới được tạo ra mỗi khi một biến bất biến được sửa đổi.

Tính đột biến

Các đối tượng có thể thay đổi hoạt động hơi khác nhau về mặt này. Khi giá trị được trỏ bởi

In [16]: a = []

In [17]: b = a

In [18]: id(a)
Out[18]: 3071546412L

In [19]: id(b)
Out[19]: 3071546412L

Cả a và b đều trỏ đến cùng một vị trí bộ nhớ.

In [20]: a.append(5)

Vị trí bộ nhớ được trỏ bởi a được sửa đổi.

In [21]: a
Out[21]: [5]

In [22]: b
Out[22]: [5]

In [23]: id(a)
Out[23]: 3071546412L

In [24]: id(b)
Out[24]: 3071546412L

Cả a và b, vẫn trỏ đến cùng một vị trí bộ nhớ. Nói cách khác, các biến có thể thay đổi hoạt động tại cùng một vị trí bộ nhớ được trỏ đến bởi biến, thay vì tạo một bản sao của giá trị được trỏ bởi biến, như trong trường hợp biến bất biến.


Cảm ơn vì điều này nhưng tôi thực sự không chắc nó phải làm gì với câu hỏi. (không, tôi không phản đối)
Ramy
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.