创建变量并分配值

要在 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。简单吧?