[关闭]
@WillireamAngel 2018-04-25T03:02:07.000000Z 字数 2321 阅读 1528

Python复制与变量

Python


本文主要介绍Python的数据结构与数据类型、深复制与浅复制、全局变量与局部变量。

一、数据结构与数据类型

1. 数据结构

Python数据结构主要分为四类:List、Tuple、Set、Dict
(1)List
List,列表或者数组,属于序列的一种。
基本表示:

  1. ['x','y','z']

Python内建的序列包括:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。

(2)Truple
Truple,元组,相比List是不能修改的序列。
基本表示:

  1. ('x','y','z')

(3)Set
Set,集合,同数学中的集合。
基本表示:

  1. {'x', 'y', 'z'}

(4)Dict
Dict,字典,键值对。
基本表示:

  1. {key1 : value1, key2 : value2 }

2. 数据类型

Python3定义的数据类型包括:Number、String、List、Tuple、Sets、Dictionary。

不可变数据:Number(数字)、String(字符串)、Tuple(元组)、Sets(集合);
可变数据:List(列表)、Dictionary(字典)。

(1)Number
Number,数字,Python3 支持 int(整数)、float(浮点数、常用于小数)、bool(布尔值,0-->False1-->True的判断)、complex(复数)等类型。
(2)String
String,字符串,基本元组的串组成。
(3)其它
其它数据类型可直接参照(1.数据结构)。

二、深复制与浅复制

1.赋值

在 python 中,赋值是建立对象的引用值,而不是复制对象。python 变量更像是指针,而不是数据存储区域。

赋值

示例:
不可变数据类型:

内存地址改变

  1. >>> a = 'str'
  2. >>> b = a
  3. >>> b
  4. 'str'
  5. >>> a += 'ing'
  6. >>> b
  7. 'str'
  8. >>> a
  9. 'string'
  10. >>> id(a)
  11. 139681110144536
  12. >>> id(b)
  13. 139681111500704

可变数据类型:

内存地址保持不变

  1. >>> c = [1,2,3]
  2. >>> d = c
  3. >>> c.append(4)
  4. >>> d
  5. [1, 2, 3, 4]
  6. >>> c
  7. [1, 2, 3, 4]
  8. >>> id(c)
  9. 139681110149128
  10. >>> id(d)
  11. 139681110149128

数组自身引用,出现无法找到对象。

  1. >>> values = [0, 1, 2]
  2. >>> values[1] = values
  3. >>> values
  4. [0, [...], 2]

2.复制

Python复制主要包括深复制和浅复制。
(1)浅复制
浅复制,shallow copy,是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用。浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
示例:
序列:[:]

  1. >>> values = [0, 1, 2]
  2. >>> values[1] = values[:]
  3. >>> values
  4. [0, [0, 1, 2], 2]
  5. >>> value_copy = values[:]
  6. >>> values[0]='n'
  7. >>> values[1][1]='q'
  8. >>> values
  9. ['n', [0, 'q', 2], 2]
  10. >>> value_copy
  11. [0, [0, 'q', 2], 2]

字典 copy 方法和copy.copy()方法,也是浅复制。

  1. >>>import copy
  2. >>>a = [0, [1, 2], 3]
  3. >>>b = copy.copy(a)
  4. >>>a[0] = 8
  5. >>>a[1][1]=9
  6. >>>a
  7. [8, [1, 9], 3]
  8. >>>b
  9. [0, [1, 9], 3]

(2)深复制
在计算机中开辟了一块新的内存地址用于存放复制的对象。

  1. >>> import copy
  2. >>>a = [0, [1, 2], 3]
  3. >>>b = copy.deepcopy(a)
  4. >>>a[0] = 8
  5. >>>a[1][1] = 9
  6. >>> a
  7. [8, [1, 9], 3]
  8. >>> b
  9. [0, [1, 2], 3]

三、局部变量与全局变量

局部变量和全局变量的差异主要在于系统调用的范围,也即系统作用域。全局变量是在整个py文件中声明,全局范围内都可以访问;局部变量是在某个函数或块中声明的,只能在该函数或块中调用。

1.局部变量

python函数中局部变量需要定义,不定义会报错。
如:

  1. UnboundLocalError: local variable 'a' referenced before assignment

正确定义:

  1. a = 0
  2. def f():
  3. a = 1
  4. print(a)
  5. f()
  6. print(a)

输出:

  1. 1
  2. 0

2.全局变量

使用global语句定义全局变量,全局变量可被同名局部变量替换,将全局变量传入函数中,需要定义全局变量。

  1. a = 0
  2. def f():
  3. global a
  4. a = 1
  5. print(a)
  6. f()
  7. print(a)

输出:

  1. 1
  2. 1

3.循环变量

循环中变量使用的是上一层定义的变量,例如定义一个函数f中的if/while循环,传入循环中的变量是函数中的变量,返回的亦是同等变量。如果是全局环境下的ifhUAN/while循环,传入循环中的是全局变量,返回时亦是全局变量。
示例:

  1. a = 1
  2. def foo():
  3. a = 0
  4. for i in range(4):
  5. a += i
  6. print(a)
  7. foo()
  8. print(a)

输出:

  1. 6
  2. 1

修改函数为环境变量或循环定义在全局环境:

  1. a = 1
  2. def foo():
  3. global a
  4. a = 0
  5. for i in range(4):
  6. a += i
  7. print(a)
  8. foo()
  9. print(a)
  1. a =
  2. for i in range(4):
  3. a += i
  4. print(a)

输出结果均为6

参考文章

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注