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))

Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数

  二、字典、元组、列表

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

创建一个变量,该变量指向原来内存地址

n1 = {"k1": "allen", "k2": 123, "k3": ["jenny", 666]}
n2 = n1

Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数

 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
nonlocal指定上一级的变量

相关文章: