建立變數並分配值
要在 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)
變數命名規則:
- 變數名稱必須以字母或下劃線開頭。
x = True # valid
_y = True # valid
9x = False # starts with numeral
=> SyntaxError: invalid syntax
$y = False # starts with symbol
=> SyntaxError: invalid syntax
- 變數名的其餘部分可能包含字母,數字和下劃線。
has_0_in_it = "Still Valid"
- 名稱區分大小寫。
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
當使用這種級聯賦值時,重要的是要注意所有三個變數 a
,b
和 c
引用記憶體中的同一個物件,一個值為 1 的 int
物件。換句話說,a
,b
和 c
是三個不同的名稱給同一個 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.
以上對於可變型別(如 list
,dict
等)也是如此,就像對於不可變型別(如 int
,string
,tuple
等)一樣:
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
。簡單吧?