Python中數據的常用操作
數據拷貝
根據以下代碼可以看出l1和l2實際上都是對于數據的引用,當l1被改變了,l2也會發生同樣的改變,l2 = l1只是將l2指向了l1所指向的地址。
>>> l1 = [1,2,[3,4],[5,6]]
>>> l2 = l1
>>> l1[2][0] = 1
>>> print(l1[2][0])
1
>>> print(l2[2][0])
1
>>>
那么該如何使得l2不再指向l1所指向的數據,自己開辟一塊新的數據呢?我們可以使用copy這個方法
可以看出,copy生成的l2在l1被修改之后并不會修改。
>>> l1 = [1,2,[3,4]]
>>> l2 = l1.copy()
>>> l1[0] = 7
>>> print(l1)
[7, 2, [3, 4]]
>>> print(l2)
[1, 2, [3, 4]]
但是問題并沒有被完全解決。從以下代碼可以看出,外層的數據淺拷貝之后互不影響;但是嵌套的列表結構淺拷貝之后還是會互相影響。因此在這種情況下需要用到深拷貝。
>>> l1 = [1,2,[3,4]]
>>> l2 = l1.copy()
>>> l1[0] = 7
>>> print(l1)
[7, 2, [3, 4]]
>>> print(l2)
[1, 2, [3, 4]]
>>> l1 = [1,2,[3,4]]
>>> l2 = l1.copy()
>>> l2[0] = 7
>>> print(l2)
[7, 2, [3, 4]]
>>> print(l1)
[1, 2, [3, 4]]
>>> l2[2][0] = 6
>>> print(l1)
[1, 2, [6, 4]]
>>> print(l2)
[7, 2, [6, 4]]
深拷貝需要導入copy包,使用copy.deepcopy(l1)的方法拷貝l1。下面的方法拷貝之后l1中的嵌套列表被修改,l2中的值也不會變。
>>> l1 = [1,2,[3,4]]
>>> l2 = copy.deepcopy(l1)
>>> l1[2][0] = 7
>>> print(l1)
[1, 2, [7, 4]]
>>> print(l2)
[1, 2, [3, 4]]
運算符
Python運算符可以分為七類:
算術運算符、比較運算符、賦值運算符、邏輯運算符、位運算符、成員運算符、身份運算符。
Python運算符可以分為七類,每類運算符都有其特定的用途和語法規則:
- 算術運算符
用于基本的數學運算:
-
- 加法(如:3 + 5 = 8)
-
- 減法(如:10 - 4 = 6)
-
- 乘法(如:2 * 6 = 12)
- / 除法(如:9 / 3 = 3.0)
- % 取模(如:10 % 3 = 1)
- ** 冪運算(如:2 ** 3 = 8)
- // 取整除(如:9 // 2 = 4)
- 比較運算符
用于比較兩個值,返回布爾值True或False:
- == 等于(如:5 == 5 → True)
- != 不等于(如:3 != 2 → True)
-
大于(如:6 > 4 → True)
- < 小于(如:3 < 5 → True)
-
= 大于等于(如:7 >= 7 → True)
- <= 小于等于(如:4 <= 5 → True)
- 賦值運算符
用于給變量賦值:
- = 基本賦值(如:x = 5)
- += 加法賦值(如:x += 3等價于x = x + 3)
- -= 減法賦值
- *= 乘法賦值
- /= 除法賦值
- %= 取模賦值
- **= 冪賦值
- //= 取整除賦值
- 邏輯運算符
用于組合條件判斷:
- and 與(如:x > 0 and x < 10)
- or 或(如:x == 5 or x == 10)
- not 非(如:not(x > 10))
- 位運算符
對數值的二進制位進行操作:
- & 按位與
- | 按位或
- ^ 按位異或
- ~ 按位取反
- << 左移
-
右移
- 成員運算符
測試序列中是否包含某個成員:
- in (如:‘a’ in [‘a’,‘b’,‘c’] → True)
- not in (如:‘d’ not in ‘abc’ → True)
- 身份運算符
比較兩個對象的內存地址:
- is (如:a is b)
- is not (如:x is not None)
is和==的區別:is用于判斷兩個變量引用對象是否是同一個,==用于判斷引用變量的值是否相等。
數據結構基礎
數據結構的分類:
–線性表
–數組
–鏈表
–隊列
–樹
–圖
–堆棧
–散列表