@WillireamAngel
2018-04-25T03:02:07.000000Z
字数 2321
阅读 1639
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 = 0def f():a = 1print(a)f()print(a)
输出:
10
使用global语句定义全局变量,全局变量可被同名局部变量替换,将全局变量传入函数中,需要定义全局变量。
a = 0def f():global aa = 1print(a)f()print(a)
输出:
11
循环中变量使用的是上一层定义的变量,例如定义一个函数f中的if/while循环,传入循环中的变量是函数中的变量,返回的亦是同等变量。如果是全局环境下的ifhUAN/while循环,传入循环中的是全局变量,返回时亦是全局变量。
示例:
a = 1def foo():a = 0for i in range(4):a += iprint(a)foo()print(a)
输出:
61
修改函数为环境变量或循环定义在全局环境:
a = 1def foo():global aa = 0for i in range(4):a += iprint(a)foo()print(a)
a =for i in range(4):a += iprint(a)
输出结果均为6。