1、数字和字符串
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
import copy # 定义变量 数字、字符串 # n1 = 123 n1 = 'jack' print(id(n1)) # 赋值 n2 = n1 print(id(n2)) # 浅拷贝 n3 = copy.copy(n1) print(id(n3)) # 深拷贝 n4 = copy.deepcopy(n1) print(id(n4))
二、字典、元组、列表
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
创建一个变量,该变量指向原来内存地址
n1 = {"k1": "allen", "k2": 123, "k3": ["jenny", 666]}
n2 = n1
1、浅拷贝
在内存中只拷贝第一层数据
#浅拷贝 import copy n1 = {"k1": "allen", "k2": 123, "k3": ["jenny", 666]} n2 = copy.copy(n1) print(n1) print(n2) # 输出:{'k1': 'allen', 'k2': 123, 'k3': ['jenny', 666]} # {'k1': 'allen', 'k2': 123, 'k3': ['jenny', 666]} n1['k2']='456' n1['k3'][0]="Tom" print(n1) print(n2) # 输出:{'k1': 'allen', 'k2': '456', 'k3': ['Tom', 666]} # {'k1': 'allen', 'k2': 123, 'k3': ['Tom', 666]}
2、深拷贝
在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
#深拷贝 import copy n1 = {"k1": "allen", "k2": 123, "k3": ["jenny", 666]} n2 = copy.deepcopy(n1) print(n1) print(n2) # 输出:{'k1': 'allen', 'k2': 123, 'k3': ['jenny', 666]} # {'k1': 'allen', 'k2': 123, 'k3': ['jenny', 666]} n1['k2']='456' n1['k3'][0]="Tom" print(n1) print(n2) # 输出:{'k1': 'allen', 'k2': '456', 'k3': ['Tom', 666]} # {'k1': 'allen', 'k2': 123, 'k3': ['jenny', 666]}
二、变量
变量是命名的内存地址空间
1、声明变量
#-*- coding:utf-8 -*- name ='Tom'
上述代码声明了一个变量,变量名为: name,变量name的值为:"Tom"
变量定义的规则:
- 变量名只能是 字母、数字或下划线的任意组合
- 变量名的第一个字符不能是数字
-
以下关键字不能声明为变量名
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
2、变量的赋值
name='Tom' name1=name print(name,name1) name='lily' print(name,name1)
这时name1的值是多少?
答案:
Tom Tom
lily Tom
3、局部变量
就是在函数内部定义的变量
不同的函数:可以定义相同的名字的局部变量,但是各用各的,相互之间不会产生影响
局部变量的作用:为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
def test1(): a=100 def test2(): print("a=%d"%a) test1() #调用test1() test2() #结果是打印a 因为变量a没定义 所以出现错误
除了字符串和整数不可以在函数里边改
列表,字典,集合可以在函数里改
names=['Jim','Tom','Rain'] def change_name(): names[0]='王者荣耀' print('--函数里面--',names) change_name() print(names) 输出: --函数里面-- ['王者荣耀', 'Tom', 'Rain'] ['王者荣耀', 'Tom', 'Rain']
4、全局变量
在函数外边定义,在任何函数里边都可以使用
a=100 #全局变量a def test1(): print('a=%d'%a) #函数中如果没有定义变量 它会去全局中寻找该变量 def test2(): print('a=%d'%a) test1() test2()
5、局部变量和全局变量的区别
def get_wendu(): wendu=33 return wendu def print_wendu(wendu): print("温度是%d"%wendu) result=get_wendu() print_wendu(result) #如果一个函数有返回值,但是没有在调用函数之前用个变量保存的话,那么没有任何作用
使用global声明全局变量
wendu=0 #定义一个全局变量,wendu def get_wendu(): global wendu #使用global用来对声明一个全局变量
wendu=33 def print_wendu(): print("温度是%d"%wendu) get_wendu() print_wendu()
name="Jim" def outer(): name="Lucy" def inner(): global name #global是全局变量 name="Lily" inner() print(name) #此处打印的是outer函数中的name print(name) outer() print(name) #输出:Jim # Lucy # Lily
name="Jim" def outer(): name="Lucy" def inner(): nonlocal name #指定上一级的变量 name="Lily" inner() print(name) print(name) outer() print(name) #输出:Jim # Lily # Jim