Hướng dẫn can you modify a variable in python? - bạn có thể sửa đổi một biến trong python không?

Lỗi bạn nhận được khi bạn cố gắng chạy mã của mình là:

UnboundLocalError: local variable 'a' referenced before assignment

Mà, trên mặt của nó, có vẻ lạ: sau tất cả, câu lệnh đầu tiên trong mã trên [

def test[]:
    global a
    a = a + 10
    print[a]
7] là một nhiệm vụ. Vì vậy những gì đang xảy ra?

Trên thực tế, có hai điều riêng biệt xảy ra, và cả hai đều không rõ ràng trừ khi bạn đã biết về chúng.

Trước hết, bạn thực sự có hai biến khác nhau:

  • def test[]:
        global a
        a = a + 10
        print[a]
    
    8 trong dòng đầu tiên của bạn là một biến toàn cầu [được gọi là vì nó tồn tại trong phạm vi toàn cầu, bên ngoài bất kỳ định nghĩa chức năng nào].

  • def test[]:
        global a
        a = a + 10
        print[a]
    
    8 trong các dòng khác là một biến cục bộ, có nghĩa là nó chỉ tồn tại bên trong hàm
    a = 15
    
    def test[x]:
        x = x + 10
        print[x]
    
    test[a]
    
    0 của bạn.

Hai biến này hoàn toàn không liên quan đến nhau, mặc dù chúng có cùng tên.

Một biến là cục bộ cho một hàm nếu có một câu lệnh gán cho nó bên trong hàm đó - ví dụ: dòng

a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
1 của bạn.

Mặc dù vậy, lỗi vẫn trông lạ - sau tất cả, điều đầu tiên bạn làm trong

a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
0 được gán cho
def test[]:
    global a
    a = a + 10
    print[a]
8, vậy làm thế nào nó có thể được tham chiếu trước?

Câu trả lời là, trong một tuyên bố gán, Python đánh giá mọi thứ ở phía bên phải của dấu hiệu

a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
4 trước khi gán nó cho tên ở phía bên trái - vì vậy mặc dù bài tập được viết đầu tiên trong mã của bạn,
def test[]:
    global a
    a = a + 10
    print[a]
8 được tham chiếu trước Ở phía bên phải đó:
a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
6.

Có hai cách bạn có thể có được xung quanh này. Đầu tiên là nói với Python rằng bạn thực sự muốn

def test[]:
    global a
    a = a + 10
    print[a]
8 bên trong
a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
0 giống nhau
def test[]:
    global a
    a = a + 10
    print[a]
8 trong phạm vi toàn cầu:

def test[]:
    global a
    a = a + 10
    print[a]

Điều này sẽ hoạt động, nhưng đó là một cách khá tệ để viết các chương trình. Việc thay đổi các biến toàn cầu bên trong các chức năng khó quản lý thực sự nhanh chóng, bởi vì bạn thường có nhiều chức năng và không ai trong số chúng có thể chắc chắn rằng một trong số đó không gây rối với biến toàn cầu theo một cách nào đó mà họ không mong đợi.

Một cách tốt hơn là chuyển các biến làm đối số cho các hàm, như thế này:

a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]

Lưu ý rằng tên không phải giống nhau - định nghĩa mới của bạn về

a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
0 chỉ nói rằng nó chấp nhận một giá trị, và sau đó làm điều gì đó với nó. Bạn có thể vượt qua bất cứ thứ gì bạn thích - nó có thể là
def test[]:
    global a
    a = a + 10
    print[a]
8 hoặc số
>>> a = 15
>>> test[a]
25
>>> a
15
2 hoặc thứ gì đó khác. Trên thực tế, mã của bạn sẽ luôn dễ hiểu hơn nếu bạn cố gắng tránh có các biến có cùng tên trong các phạm vi khác nhau.

Nếu bạn chơi với mã ở trên, bạn sẽ nhận thấy điều gì đó thú vị:

>>> a = 15
>>> test[a]
25
>>> a
15

Mạnh

def test[]:
    global a
    a = a + 10
    print[a]
8 không thay đổi! Đó là bởi vì mặc dù bạn đã chuyển nó vào
a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
0 và nó được gán cho
>>> a = 15
>>> test[a]
25
>>> a
15
5, nhưng sau đó
>>> a = 15
>>> test[a]
25
>>> a
15
5 đã thay đổi, chỉ để lại
def test[]:
    global a
    a = a + 10
    print[a]
8 ban đầu.

Nếu bạn muốn thực sự thay đổi

def test[]:
    global a
    a = a + 10
    print[a]
8, bạn cần trả lại
>>> a = 15
>>> test[a]
25
>>> a
15
5 đã sửa đổi của mình từ chức năng, sau đó chỉ định lại nó trở lại
def test[]:
    global a
    a = a + 10
    print[a]
8 ở bên ngoài:

>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25

Đăng nhập vào tài khoản Python Barsels của bạn để lưu cài đặt screencast của bạn.

Vẫn chưa có tài khoản? Đăng ký tại đây.

Từ "thay đổi" là mơ hồ trong Python: chúng ta có hai loại "thay đổi" riêng biệt trong Python."change" is ambiguous in Python: we have two distinct types of "change" in Python.

Chúng ta có thể "thay đổi" một biến bằng cách thay đổi đối tượng mà biến đang chỉ vào. Chúng tôi làm điều đó thông qua một tuyên bố chuyển nhượng.

Chúng ta cũng có thể "thay đổi" một đối tượng thực tế thông qua một đột biến.

Chúng ta hãy xem cả hai loại thay đổi.

Bài tập

Hãy nói rằng chúng tôi có một biến

>>> a = 15
>>> test[a]
25
>>> a
15
5 trỏ đến giá trị 4.

Chúng ta có thể sử dụng chức năng ID tích hợp để có được vị trí bộ nhớ của đối tượng Biến này

>>> a = 15
>>> test[a]
25
>>> a
15
5 đang chỉ ra [mã định danh duy nhất này sẽ không bao giờ thay đổi trong vòng đời của một đối tượng]:

>>> id[x]
140727864255408

Nếu chúng ta trỏ

>>> a = 15
>>> test[a]
25
>>> a
15
5 vào một đối tượng mới, hãy nói một danh sách, đó là
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
4 sẽ thay đổi:

>>> x = [1, 2, 3]
>>> id[x]
2253221094088

Nếu chúng ta gán

>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 cho
>>> a = 15
>>> test[a]
25
>>> a
15
5, điều này sẽ làm cho
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 trỏ đến cùng một vị trí bộ nhớ như
>>> a = 15
>>> test[a]
25
>>> a
15
5:

>>> y = x
>>> id [y]
2253221094088

Đây là loại thay đổi đầu tiên: gán. Chúng ta có thể thay đổi đối tượng nào một biến đang chỉ bằng cách thực hiện một bài tập.which object a variable is pointing to by doing an assignment.

Đột biến

Loại "thay đổi" thứ hai là đột biến. Chuyển đổi thay đổi biến, nhưng đột biến thay đổi đối tượng.mutation. Assignment changes variables, but mutation changes objects.

Hầu hết các đối tượng Python có thể được thay đổi sau khi chúng được tạo. Danh sách, bộ và từ điển đều có thể được thay đổi, trong khi các bộ dữ liệu, số và chuỗi không thể. Các đối tượng có thể được thay đổi được gọi là có thể thay đổi và hành động thay đổi một trong những đối tượng này là một đột biến.mutable and the act of changing one of these objects is a mutation.

Bài tập khá nhiều luôn liên quan đến một dấu hiệu

a = 15

def test[x]:
    x = x + 10
    print[x]

test[a]
4, trong khi đột biến có thể có rất nhiều hình thức: một hình thức là một cuộc gọi phương thức. Ví dụ: gọi phương thức
>>> id[x]
140727864255408
0 trong danh sách.

Hãy lấy danh sách của chúng tôi từ trước đó cả

>>> a = 15
>>> test[a]
25
>>> a
15
5 và
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 chỉ đến:

>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> id[x]
2253221094088
>>> id [y]
2253221094088

Và chúng tôi sẽ gọi phương thức

>>> id[x]
140727864255408
0 trên biến
>>> a = 15
>>> test[a]
25
>>> a
15
5 để thêm một mục mới vào danh sách của chúng tôi:

>>> x.append[4]
>>> x
[1, 2, 3, 4]

Hãy nhớ rằng cả

>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 và
>>> a = 15
>>> test[a]
25
>>> a
15
5 đều chỉ vào cùng một đối tượng, vì vậy nếu chúng ta nhìn vào
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5, nó dường như cũng sẽ thay đổi:

Lưu ý rằng chúng tôi đã không thực sự "thay đổi"

>>> a = 15
>>> test[a]
25
>>> a
15
5 hoặc
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 vì
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
4 của hai biến này giống như trước đây:

def test[]:
    global a
    a = a + 10
    print[a]
0

Thay vào đó, chúng tôi đã thay đổi đối tượng mà hai biến này đang chỉ ra.

Bản tóm tắt

Để tóm tắt lại, nếu chúng ta có hai biến

>>> a = 15
>>> test[a]
25
>>> a
15
5 và
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 và cả hai đều chỉ vào cùng một đối tượng trong bộ nhớ:

def test[]:
    global a
    a = a + 10
    print[a]
1

Nếu chúng tôi sau đó đã chỉ định lại

>>> a = 15
>>> test[a]
25
>>> a
15
5 vào một danh sách mới:

def test[]:
    global a
    a = a + 10
    print[a]
2

Tôi đã thực hiện một bài tập có nghĩa là tôi đã thay đổi đối tượng nào biến

>>> a = 15
>>> test[a]
25
>>> a
15
5 đang chỉ.assignment which means I've changed which object the variable
>>> a = 15
>>> test[a]
25
>>> a
15
5 is pointing to.

Biến

>>> a = 15
>>> test[a]
25
>>> a
15
5 đã thay đổi ở đây nhưng
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 không có:

Bởi vì chúng tôi đã không chỉ

>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 bất cứ nơi nào mới: chúng tôi chỉ chỉ
>>> a = 15
>>> test[a]
25
>>> a
15
5 vào một đối tượng mới, vì vậy
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
4 của nó đã thay đổi nhưng
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
4 của
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 giống như trước đây:

def test[]:
    global a
    a = a + 10
    print[a]
3

Nếu chúng ta trỏ

>>> a = 15
>>> test[a]
25
>>> a
15
5 và
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 trở lại cùng một đối tượng và sau đó gọi một phương thức trên đối tượng này để yêu cầu nó tự đột biến:

def test[]:
    global a
    a = a + 10
    print[a]
4

Cả

>>> a = 15
>>> test[a]
25
>>> a
15
5 và
>>> a = 15
>>> 
>>> def test[x]:
...     x = x + 10
...     print[x]
...     return x
... 
>>> a = test[a]
25
>>> a
25
5 sẽ phản ánh sự thay đổi này:

def test[]:
    global a
    a = a + 10
    print[a]
5

Bởi vì hai biến này trỏ đến cùng một đối tượng:these two variables point to the same object:

def test[]:
    global a
    a = a + 10
    print[a]
6

Vì vậy, hai loại thay đổi trong Python là:

  1. Nhiệm vụ, thay đổi đối tượng mà một biến chỉ ra, which changes which object a variable points to
  2. Đột biến, thay đổi chính một đối tượng [sẽ xuất hiện để thay đổi mọi biến chỉ vào đối tượng đó], which changes an object itself [that will appear to change every variable that points to that object]

Làm thế nào để bạn sửa đổi một giá trị biến trong Python?

Nếu bạn cố gắng cập nhật một biến không tồn tại, bạn sẽ gặp lỗi vì Python đánh giá biểu thức ở phía bên phải của toán tử gán trước khi nó gán giá trị kết quả cho tên bên trái.Trước khi bạn có thể cập nhật một biến, bạn phải khởi tạo nó, thường là với một bài tập đơn giản.Before you can update a variable, you have to initialize it, usually with a simple assignment.

Làm thế nào để bạn sửa đổi tất cả các biến trong Python?

Nếu bạn đang sử dụng python idle [GUI], bạn có thể ctrl + h và chọn thay thế tất cả.

Có thể thay đổi giá trị biến?

Bạn cũng có thể thay đổi một giá trị biến bằng cách chọn biến và sau đó sửa đổi giá trị trong khung chi tiết..

Điều gì không thể thay đổi trong Python?

Các chuỗi Python là "bất biến", điều đó có nghĩa là chúng không thể thay đổi sau khi chúng được tạo ra [chuỗi Java cũng sử dụng phong cách bất biến này].Vì các chuỗi không thể thay đổi, chúng tôi xây dựng các chuỗi * mới * khi chúng tôi đi để biểu diễn các giá trị được tính toán. [Java strings also use this immutable style]. Since strings can't be changed, we construct *new* strings as we go to represent computed values.

Chủ Đề