建立變數並分配值

要在 Python 中建立變數,你需要做的就是指定變數名稱,然後為其賦值。

<variable name> = <value>

Python 使用 = 為變數賦值。不需要提前宣告變數(或為其分配資料型別),為變數本身賦值並宣告並使用該值初始化變數。如果沒有為變數賦值,則無法宣告變數。

# Integer
a = 2
print(a)
# Output: 2

# Integer    
b = 9223372036854775807
print(b)
# Output: 9223372036854775807

# Floating point
pi = 3.14
print(pi)
# Output: 3.14

# String
c = 'A'
print(c)
# Output: A

# String    
name = 'John Doe'
print(name)
# Output: John Doe

# Boolean    
q = True
print(q)
# Output: True

# Empty value or null data type
x = None
print(x)
# Output: None

變數賦值從左到右。因此,以下內容將為你提供語法錯誤。

0 = x
=> Output: SyntaxError: can't assign to literal

你不能將 python 的關鍵字用作有效的變數名。你可以通過以下方式檢視關鍵字列表:

import keyword
print(keyword.kwlist)

變數命名規則:

  1. 變數名稱必須以字母或下劃線開頭。
 x  = True   # valid
 _y = True   # valid

 9x = False  # starts with numeral 
 => SyntaxError: invalid syntax   

 $y = False #  starts with symbol 
 => SyntaxError: invalid syntax
  1. 變數名的其餘部分可能包含字母,數字和下劃線。
has_0_in_it = "Still Valid" 
  1. 名稱區分大小寫。
x = 9  
y = X*5   
=>NameError: name 'X' is not defined

儘管在 Python 中宣告變數時不需要指定資料型別,但在記憶體中為變數分配必要的區域時,Python 直譯器會自動為其選擇最合適的內建型別

a = 2
print(type(a))
# Output: <type 'int'>

b = 9223372036854775807
print(type(b))
# Output: <type 'int'>

pi = 3.14
print(type(pi))
# Output: <type 'float'>

c = 'A'
print(type(c))
# Output: <type 'str'>

name = 'John Doe'
print(type(name))
# Output: <type 'str'>

q = True
print(type(q))
# Output: <type 'bool'>

x = None
print(type(x))
# Output: <type 'NoneType'>

現在你已經瞭解了賦值的基礎知識,讓我們在 python 中獲得關於賦值的精妙之處。

當你使用 = 做一個賦值操作,你對 = 的左邊是一個名稱物件在右邊。最後,= 的作用是將右側物件的引用分配給左側的名稱

那是:

a_name = an_object  # "a_name" is now a name for the reference to the object "an_object"

因此,從上述許多分配的例子,如果我們選擇 pi = 3.14,然後 pi一個名稱(不是名字,因為一個物件可以有多個名字)為物件 3.14。如果你對下面的內容不瞭解,請回到這一點並再次閱讀! 此外,你可以檢視此內容以便更好地理解。

你可以在一行中為多個變數分配多個值。請注意,= 運算子的右側和左側必須有相同數量的引數:

a, b, c = 1, 2, 3
print(a, b, c)
# Output: 1 2 3

a, b, c = 1, 2
=> Traceback (most recent call last):
=>   File "name.py", line N, in <module>
=>     a, b, c = 1, 2
=> ValueError: need more than 2 values to unpack

a, b = 1, 2, 3
=> Traceback (most recent call last):
=>   File "name.py", line N, in <module>
=>     a, b = 1, 2, 3
=> ValueError: too many values to unpack

通過將剩餘值分配給相等數量的任意變數,可以避免最後一個示例中的錯誤。這個虛擬變數可以有任何名稱,但通常使用下劃線(_)來分配不需要的值:

a, b, _ = 1, 2, 3
print(a, b)
# Output: 1, 2

請注意,_的數量和剩餘值的數量必須相等。否則,如上所述丟擲解壓錯誤的值太多

a, b, _ = 1,2,3,4
=>Traceback (most recent call last):
=>File "name.py", line N, in <module>
=>a, b, _ = 1,2,3,4
=>ValueError: too many values to unpack (expected 3)

你還可以同時為多個變數分配單個值。

a = b = c = 1
print(a, b, c)
# Output: 1 1 1

當使用這種級聯賦值時,重要的是要注意所有三個變數 abc 引用記憶體中的同一個物件,一個值為 1 的 int 物件。換句話說,abc 是三個不同的名稱給同一個 int 物件。之後為其中一個分配不同的物件不會改變其他物件,就像預期的那樣:

a = b = c = 1    # all three names a, b and c refer to same int object with value 1
print(a, b, c)
# Output: 1 1 1
b = 2            # b now refers to another int object, one with a value of 2
print(a, b, c)
# Output: 1 2 1  # so output is as expected.

以上對於可變型別(如 listdict 等)也是如此,就像對於不可變型別(如 intstringtuple 等)一樣:

x = y = [7, 8, 9]   # x and y refer to the same list object just created, [7, 8, 9]
x = [13, 8, 9]      # x now refers to a different list object just created, [13, 8, 9]
print(y)            # y still refers to the list it was first assigned
# Output: [7, 8, 9]

到現在為止還挺好。當級聯賦值用於可變型別時,在修改物件時(與名稱分配給不同的物件,我們在上面做過) 相比,情況有所不同。看看下面,你會看到它的第一手:

x = y = [7, 8, 9]     # x and y are two different names for the same list object just created, [7, 8, 9]
x[0] = 13             # we are updating the value of the list [7, 8, 9] through one of its names, x in this case
print(y)              # printing the value of the list using its other name
# Output: [13, 8, 9]  # hence, naturally the change is reflected

巢狀列表在 python 中也有效。這意味著列表可以包含另一個列表作為元素。

x = [1, 2, [3, 4, 5], 6, 7] # this is nested list
print x[2]
# Output: [3, 4, 5]
print x[2][1]
# Output: 4

最後,Python 中的變數不必保持與它們首次定義的型別相同 - 你可以簡單地使用 = 為變數賦值,即使該值屬於不同型別。

a = 2 
print(a)
# Output: 2

a = "New value"
print(a)
# Output: New value

如果這困擾你,請考慮一下 = 左側的內容只是一個物件的名稱。首先用 a 呼叫 int 物件,然後改變主意並決定將 a 這個名稱賦予 string 物件,其值為 New value。簡單吧?