@WillireamAngel
2018-04-25T03:02:07.000000Z
字数 2321
阅读 1528
Python
本文主要介绍Python的数据结构与数据类型、深复制与浅复制、全局变量与局部变量。
Python数据结构主要分为四类:List、Tuple、Set、Dict
(1)List
List,列表或者数组,属于序列的一种。
基本表示:
['x','y','z']
Python内建的序列包括:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。
(2)Truple
Truple,元组,相比List是不能修改的序列。
基本表示:
('x','y','z')
(3)Set
Set,集合,同数学中的集合。
基本表示:
{'x', 'y', 'z'}
(4)Dict
Dict,字典,键值对。
基本表示:
{key1 : value1, key2 : value2 }
Python3定义的数据类型包括:Number、String、List、Tuple、Sets、Dictionary。
不可变数据:Number(数字)、String(字符串)、Tuple(元组)、Sets(集合);
可变数据:List(列表)、Dictionary(字典)。
(1)Number
Number,数字,Python3 支持 int(整数)、float(浮点数、常用于小数)、bool(布尔值,0-->False
或1-->True
的判断)、complex(复数)等类型。
(2)String
String,字符串,基本元组的串组成。
(3)其它
其它数据类型可直接参照(1.数据结构)。
在 python 中,赋值是建立对象的引用值,而不是复制对象。python 变量更像是指针,而不是数据存储区域。
示例:
不可变数据类型:
内存地址改变
>>> a = 'str'
>>> b = a
>>> b
'str'
>>> a += 'ing'
>>> b
'str'
>>> a
'string'
>>> id(a)
139681110144536
>>> id(b)
139681111500704
可变数据类型:
内存地址保持不变
>>> c = [1,2,3]
>>> d = c
>>> c.append(4)
>>> d
[1, 2, 3, 4]
>>> c
[1, 2, 3, 4]
>>> id(c)
139681110149128
>>> id(d)
139681110149128
数组自身引用,出现无法找到对象。
>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]
Python复制主要包括深复制和浅复制。
(1)浅复制
浅复制,shallow copy,是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用。浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
示例:
序列:[:]
>>> values = [0, 1, 2]
>>> values[1] = values[:]
>>> values
[0, [0, 1, 2], 2]
>>> value_copy = values[:]
>>> values[0]='n'
>>> values[1][1]='q'
>>> values
['n', [0, 'q', 2], 2]
>>> value_copy
[0, [0, 'q', 2], 2]
字典 copy 方法和copy.copy()方法,也是浅复制。
>>>import copy
>>>a = [0, [1, 2], 3]
>>>b = copy.copy(a)
>>>a[0] = 8
>>>a[1][1]=9
>>>a
[8, [1, 9], 3]
>>>b
[0, [1, 9], 3]
(2)深复制
在计算机中开辟了一块新的内存地址用于存放复制的对象。
>>> import copy
>>>a = [0, [1, 2], 3]
>>>b = copy.deepcopy(a)
>>>a[0] = 8
>>>a[1][1] = 9
>>> a
[8, [1, 9], 3]
>>> b
[0, [1, 2], 3]
局部变量和全局变量的差异主要在于系统调用的范围,也即系统作用域。全局变量是在整个py文件中声明,全局范围内都可以访问;局部变量是在某个函数或块中声明的,只能在该函数或块中调用。
python函数中局部变量需要定义,不定义会报错。
如:
UnboundLocalError: local variable 'a' referenced before assignment
正确定义:
a = 0
def f():
a = 1
print(a)
f()
print(a)
输出:
1
0
使用global语句定义全局变量,全局变量可被同名局部变量替换,将全局变量传入函数中,需要定义全局变量。
a = 0
def f():
global a
a = 1
print(a)
f()
print(a)
输出:
1
1
循环中变量使用的是上一层定义的变量,例如定义一个函数f中的if/while循环,传入循环中的变量是函数中的变量,返回的亦是同等变量。如果是全局环境下的ifhUAN/while循环,传入循环中的是全局变量,返回时亦是全局变量。
示例:
a = 1
def foo():
a = 0
for i in range(4):
a += i
print(a)
foo()
print(a)
输出:
6
1
修改函数为环境变量或循环定义在全局环境:
a = 1
def foo():
global a
a = 0
for i in range(4):
a += i
print(a)
foo()
print(a)
a =
for i in range(4):
a += i
print(a)
输出结果均为6
。