Xóa biến trong python


207

Có cách nào để xóa giá trị của một biến trong python không?

Ví dụ: nếu tôi đang thực hiện một cây nhị phân:

Class Node:
    self.left = somenode1
    self.right = somenode2

Nếu tôi muốn xóa một số nút khỏi cây, tôi sẽ cần phải đặt self.leftthành trống.


Câu trả lời:


157

Có chuyện gì với bạn self.left = Nonevậy?


19
Không quen thuộc với từ khóa Không có. Điều này có giống với null trong các ngôn ngữ khác không?
Bnicholas

6
Đúng; nó tương đương với null.
Smashery

12
@Bnicholas Tuy nhiên, nó không giống như nulltrong PHP, trong đó việc đặt một biến thành nulltrong PHP mang lại cho bạn hành vi tương tự trong hầu hết các trường hợp như thể bạn đã không định nghĩa nó ở vị trí đầu tiên. Một giá trị Nonetrong Python khá khác với một biến không xác định. tuy nhiên, Nonekhá giống với hầu hết các hóa thân khác null(ít nhất là cho đến khi chúng ta có được nhiều chi tiết phức tạp hơn).
Ben

Đây không phải là một từ khóa; đó là tên được đặt theo mặc định cho một đối tượng tích hợp. Bạn có thể làm bất cứ điều gì với những Nonegì bạn có thể làm với bất kỳ đối tượng "đơn giản" nào khác thuộc loại không xác định: lưu trữ nó trong các thùng chứa, in một chuỗi đại diện của nó, kiểm tra một số siêu dữ liệu trên nó ... Dù sao, bạn đã thử Google cho "python null tương đương"? Tôi nghiêm túc; nó sẽ mất một chút phân tích, nhưng thông tin ở ngay đó.
Karl Knechtel

18
Mở terminal python và gõ print xvà nhấn enter. Điều này sẽ tạo ra lỗi trình thông dịch, cũng như hầu hết các ngôn ngữ khi bạn cố in một biến không xác định. Nhưng nếu bạn xác định biến, và sau đó cố gắng xóa nó bằng Không, sử dụng print xmã sẽ tạo ra từ Nonelàm đầu ra. Tôi chưa quen với python nên tôi có thể bị nhầm, nhưng điều này dường như không giống với hành vi của một biến bị xóa.
Musixauce3000

407

Các deltừ khóa sẽ làm.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Nhưng trong trường hợp này tôi bỏ phiếu cho self.left = None


18
đôi khi điều này không loại bỏ nó hoàn toàn, điều này chỉ loại bỏ tham chiếu đến một trong bộ nhớ. Điều này có thể để lại các biến ma trong bộ nhớ không có gc.
Jakob Bowyer

4
delcũng có nhược điểm là nếu bạn cố xóa một biến không tồn tại thì nó sẽ ném ra một ngoại lệ, điều này thường không mong muốn.
Philip Kearns

33
Tôi chỉ muốn chỉ ra rằng nếu bạn vô tình khai báo một biến được ghi đè được xây dựng trong các lệnh, ví dụ, type=… khi bạn định gõ type(…)thì xóa nó là cách dễ nhất để lấy lại chức năng ban đầu. Đó là, nếu bạn giữ nó xung quanh là Không, bạn vẫn sẽ cắt quyền truy cập vào chức năng cơ bản.
mpacer

1
Thu gom rác / Người thu gom / Thu thập
mccc

1
Đây là một trong những tôi đang tìm kiếm. Chơi ở dòng cmd, tôi đã ... set = set(myList)và sau đó nhận ra rằng tôi không thể sử dụng set nữa như một hàm (doh). Sử dụng del setcho phép tôi sử dụng lại như một fx. Tất nhiên tôi sẽ không bao giờ sử dụng var dành riêng đó trong một kịch bản thực tế.
jbeclill

111

var = None "Xóa giá trị", đặt giá trị của biến thành "null" giống như giá trị của "Không", tuy nhiên con trỏ tới biến vẫn còn.

del var loại bỏ định nghĩa cho biến hoàn toàn.

Trong trường hợp bạn muốn sử dụng biến sau này, ví dụ: đặt giá trị mới cho nó, tức là giữ lại biến, Nonesẽ tốt hơn.


Điều gì xảy ra nếu tôi muốn xóa hoàn toàn biến mà trong một số trường hợp không tồn tại. Có bất kỳ tham số để tránh một lỗi? Tôi cần xóa một số biến: del a, b, c, d Tôi có thể sử dụng vòng lặp và thử / ngoại trừ, nhưng tôi thích một số chuyển đổi để tránh nó.
Tedo Vrbanec

63

Trên thực tế, điều đó không xóa biến / thuộc tính. Tất cả những gì nó sẽ làm là đặt giá trị của nó thành None, do đó biến vẫn sẽ chiếm dung lượng trong bộ nhớ. Nếu bạn muốn xóa hoàn toàn tất cả sự tồn tại của biến khỏi bộ nhớ, bạn chỉ cần gõ:

del self.left

8
Tôi không hiểu tại sao câu trả lời = Không phổ biến đến vậy. Đây là câu trả lời đúng
Nikolay Gromov

1
OP nói clearkhông phải remove. del sẽ giết thuộc tính và tra cứu. Nó là cách sạch hơn để đặt nó thành Không, hơn bạn có thể kiểm tra if self.leftvà điều đó sẽ đủ tốt để kiểm tra xem một nút có trống không.
dùng1767754

"Cách dễ dàng hơn để đặt nó thành Không" - đáng để xem xét rằng nếu ai đó (chính bạn một thời gian sau hoặc cộng tác viên) đang đọc mã del, IMHO, làm cho rõ ràng hơn rằng biến có thể bị lãng quên khi 'phân tích tâm lý ' mật mã.
Pocketsand

1
@NikolayGromov trong mã hàng ngày của bạn, khi bạn muốn nhận giá trị của self.left bạn có muốn kiểm tra if self.left:hay bạn muốn xử lý một ngoại lệ NameError có thể sẽ làm hỏng chương trình của bạn nếu bạn không xử lý nó ở mọi nơi ?
Pierre.Sassoulas

33
  • Nếu muốn xóa hoàn toàn, hãy sử dụng del:

    del your_variable

  • Hoặc nếu không, để làm cho giá trịNone :

    your_variable = None

  • Nếu đó là một lần lặp (như danh sách hoặc bộ dữ liệu), bạn có thể làm cho nó trống như:

    your_variable.clear()

Rồi your_variablesẽ trống


Đối với tùy chọn thứ hai, "xóa nội dung của nó" là không chính xác, điều này sẽ chỉ gán lại biến thành Không, đối tượng ban đầu sẽ vẫn còn (trừ khi số tham chiếu của nó giảm xuống 0 trong trường hợp đó là rác được thu thập).
cs95

0

Bạn có muốn xóa một biến không?

ok, tôi nghĩ rằng tôi đã có một ý tưởng thay thế tốt nhất cho câu trả lời @bnul:

Bạn có thể xóa các tên riêng lẻ bằng del:

del x hoặc bạn có thể xóa chúng khỏi đối tượng globalals ():

for name in dir(): if not name.startswith('_'): del globals()[name]

Đây chỉ là một vòng lặp ví dụ; nó phòng thủ chỉ xóa các tên không bắt đầu bằng dấu gạch dưới, đưa ra một giả định (không phải không có lý) rằng bạn chỉ sử dụng tên mà không có dấu gạch dưới khi bắt đầu trong trình thông dịch. Bạn có thể sử dụng một danh sách tên được mã hóa cứng để giữ thay thế (danh sách trắng) nếu bạn thực sự muốn kỹ lưỡng. Không có chức năng tích hợp sẵn để thực hiện xóa cho bạn, ngoài việc chỉ thoát và khởi động lại trình thông dịch.

Các mô-đun bạn đã nhập (os nhập) sẽ vẫn được nhập vì chúng được tham chiếu bởi sys.modules; nhập khẩu tiếp theo sẽ sử dụng lại đối tượng mô-đun đã nhập. Bạn sẽ không có một tham chiếu đến chúng trong không gian tên toàn cầu hiện tại của bạn.

Hãy xem xét lại câu trả lời này!


-1

Tôi đã sử dụng một vài lựa chọn được đề cập ở trên:

del self.left

hoặc cài đặt giá trị thành Không sử dụng

self.left = None

Điều quan trọng là phải biết sự khác biệt và đặt một vài trình xử lý ngoại lệ khi bạn sử dụng đặt giá trị thành Không có. Nếu bạn đang in giá trị của các câu lệnh có điều kiện bằng một mẫu, hãy nói,

print("The value of the variable is {}".format(self.left))

bạn có thể thấy giá trị của biến in "Giá trị của biến là Không". Vì vậy, bạn phải đặt một vài xử lý ngoại lệ ở đó:

if self.left:
    #Then only print stuff

Lệnh trên sẽ chỉ in các giá trị nếu self.left không None

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.