我的第七篇博客---python变量的使用与进阶

python变量的使用与进阶

作用域的产生:
只有当变量在Module(模块)、Class(类)、def(函数)定义的时候,才会有作用域的概念。

在作用域中定义的变量,一般只在该作用域中有效

在if-elif-else、for-else、while、try-except/try-finally等关键字的语句块中并不会产生作用域

a=100 #全局作用域
def func1():
a=200 #嵌套作用域
def func2():
a=300 #局部作用域
print(__name__) #内置作用域

global 是声明全局变量 在函数内部修改的是全局变量的值
nonlocal 是声明嵌套变量 在函数内部修改的是嵌套变量的值

搜索变量名的优先级:
局部作用域(L) > 嵌套作用域(E) > 全局作用域(G) > 内置作用域(B)

————————————————————————————————————

内存管理机制:

Python中不但变量名无需事先声明,而且也无需类型声明。在Python语言中,对象的类型和内存占用都是运行时确定的。在赋值时解释器会根据语法和右侧的操作数来决定新对象的类型。在对象创建后,一个该对象的引用会被赋值给左侧的变量。

a=3
print(id(a))
print(id(3))
结果相同

class Hero(object):
def __init__(self,name,age):
self.name=name
self.age=age
def moving(self):
print('正在赶往战场')
def attact(self):
print('大保健...')
if __name__ == '__main__': #程序入口
f = Hero('黄忠', 18)
f2 = f # 引用计数+1
f3 = f # +1
print(id(f))
print(id(f2))
print(id(f3))
del (f2) # -1
# print(f2)
del (f3) # -1
print(id(f3))

 ————————————————————————————————————————————————————

深拷贝与浅拷贝

copy模块用于对象的拷贝操作。
import copy
新拷贝列表名=copy.copy(原列表名) 浅拷贝
新拷贝列表名=copy.deepcopy(原列表名) 深拷贝

该模块只提供了两个主要的方法:copy.copy与copy.deepcopy,分别表示浅拷贝与深拷贝。

浅拷贝:
不管是多么复杂的数据结构,浅拷贝只会拷贝第一层
浅拷贝是对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用(地址 这里的地址是被拷贝列表里元素的地址 ),并没有拷贝内容
新拷贝的列表里的每一个元素的地址与原列表里每个相同元素的地址是一样的
整体新列表地址与原列表地址是不一样的,里面对应的元素的地址是一样的

深拷贝:
深拷贝会完全复制原变量的所有数据( 递归性质的拷贝 ),在内存中生成一套完全一样的内容,我们对这两个变量中的一个进行任意修改都不会影响另一个变量。
新拷贝的列表里的每一个元素的地址与原地址里每个相同元素的地址是不一样的
整体新列表与原列表地址是不一样的 ,里面对应的元素的地址也是不一样的

结论:
浅拷贝:只拷贝了引用,并没有拷贝内容
深拷贝:类似于递归性质的拷贝,拷贝了原文件中所有的内容,相当于在内存中生成一套相同的内容。我们对源文件进行任意操作,对拷贝的文件没有任何影响。

注意点:
浅拷贝对不可变类型和可变类型的copy不同
copy.copy对于可变类型,会进行浅拷贝
对与不可变类型,不会拷贝,仅仅是指向

——————————————————————————————————————————————

is和==的区别

== 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。

is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。
a=[1,2,3]
b=a
a==b True
a is b True
c=copy.deepcopy(a)
a==c True
a is c False

猜你喜欢

转载自www.cnblogs.com/sll-csdn/p/10809620.html