数据的在内存中的地址就是数据的引用。
  如果两个变量为同一个引用,那么这两个变量对应的数据一定相同;
  如果两个变量对应的数据相同,引用不一定相同。
  通过id(数据)可以查看数据对应的地址,修改变量的值,其实是在修改变量的引用。
  数据可以分为:可变类型与不变类型
    可变类型:
      如果修改了数据的内容,数据的地址没有发生改变.
      有列表,字典,set集合
    不可变类型:
      如果修改了数据的内容,数据的地址发生改变.
      有字符串,元组,数字
  当python解释器首次启动时,会把小数字(-5~256)和短字符串(长度小于21)缓存到缓冲区中,当在程序中使用这些数字和字符串时,就直接从缓存区中取。
    m = 300
    n = 300
    print(id(m)) # 1811121856
    print(id(n))
    不在小数字或者小字符串范围内的数据,会在第一次使用时缓存起来
    m = 300
    n = 300
    print(id(m)) # 2345027009360
    print(id(n)) # 2345027009360

演示:
1.
变量a实际存储的是1的引用(地址)(在程序执行过程中a被编译为一条指令)
a = 1
b = a
print(id(a)) # 1820749280
print(id(b)) # 1820749280
a =2 # 修改不可变类型(的引用)
print(id(a)) # 1820749312 a的id已经改变
print(id(b)) # 1820749280
print(a,b)

a = [1, 2,[3,5]]
b = a
print(id(a)) # 1758314288776
print(id(b)) # 1758314288776
# a.append(3)
a[0] = 6
a[2][0] = 1
b[2][1] = 6
print(id(a)) # 1758314288776 注意a与b始终指向同一个地址
print(id(b)) # 1758314288776
print(a) # [6, 2, [1, 6]]
print(b) # [6, 2, [1, 6]]

2.

list = []
dict = {"name":"wangjie","age":23}
print(id(dict))
a = 10
list.append(dict) # 把dict的引用加入到list中 0x111 的内容是(指向){"name":"wangjie","age":23}
list.append(a) # 把a的引用加入到list中 0x222 的内容是(指向)10
print(list) # list[0] 为0x111 ,内容是(指向)数据{"name":"wangjie","age":23},list[1]的内容0x222,内容是(指向)数据10
a = 20 # 修改了a的值 a的引用发生的变化 0x333
   # 但不影响list中的引用指向的值 还是指向0x111 指向{"name":"wangjie","age":23}
   # 和0x222 指向 10
print(list)
dict["name"] = "lili" #修改了dict的值 dict为可变数据类型,dict的引用不变,但0x111的内容已经变为{'name': 'lili', 'age': 23}
print(list) # list[0]的内容是 0x111 , 指向数据{'name': 'lili', 'age': 23},list[1]的内容为0x222指向数据 10

3.
list = []
list2 = []
m = 10
def func():
  global m
  m =20
  list2 = [1,2] # 不属于修改,修改需要通过方法,这种是覆盖全局变量list2
  list.append(1) # 通过append 方法修改,list的引用不变
  print(list2) # [1, 2]
print(list) # []
print(m) # 10
print(id(m)) # 1811115776

func() # [1, 2]

print(list) # [1]
print(list2) # []
print(m) # 20
print(id(m)) # 1811116096

4.

def log2():
  #info_dict = {} # 存储学生信息的字典若放在for循环外,则旧数据会被新数据覆盖
  info_list = []
  num = input("请输入要录入信息的数量")
  num = int(num)
  for i in range(num):
    info_dict = {} # 重新直接对info_dict 赋值,info_dict的引用发生改变 存储学生信息的字典要放在for循环# 内
    print("录入第%s 位信息" % (i + 1))
    name = input("输入姓名:")
    id = input("输入学号")
    info_dict["姓名"] = name
    info_dict["学号"] = id
    info_list.append(info_dict)
  print(info_list)
  for info in info_list:
    for k ,v in info.items():
      print('%s = %s' % (k,v))
log2()

5.

a = [1, 2]
b = [3, 4]
a.append(b) # [1,2,[3,4]]
b.append(a)
print(a) # [1, 2, [3, 4, [...]]]
print(b) # [3, 4, [1, 2, [...]]]

6.传递数据,传递的是数据对应的地址.

a = [[]] * 5 
print(a) [[],[],[],[],[]]
print(id(a)) # 2132205131400
print(id(a[0])) # 2132205131592
print(id(a[1])) # 2132205131592
a.append(1)
print(id(a)) # 2132205131400
print(a) # [[],[],[],[],[],1]
a[0].append(2)
print(id(a[0])) # 2132205131592
print(a) # [[2],[2],[2],[2],[2],1]
a[1].append(3)
print(id(a[1])) # 2132205131592
print(a) # [[2,3],[2,3],[2,3],[2,3],[2,3],1]

7.

>>> def selfAdd(a):
    """自增"""
    a += a
>>> a_int = 1
>>> selfAdd(a_int)
>>> a_int
1
>>> a_list = [1,2]
>>> selfAdd(a_list)
>>> a_list
[1, 2, 1, 2]
总结:python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变量的值不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能
会更改传入参数的值

8.

  += 和append()方法等对数据引用的修改一样

9.

  a = [1,2]

  b = a * 2

  print(b)  # [1,2,1,2]

  print(id(b))  # 2745079031688

  b[0] = 55

  print(b)  # [55,2,1,2]

  print(id(b))  # 2745079031688

  print(a)  # [1,2]

  修改了b[0] ,则b[0] 的引用发生改变,但b的引用没发生变化 

9.

  第一种情况:

  def func(x,l = []):

    for i in range(x):

      l.append(i+1)

    print(l)
  func(3)  #  [1,2,3]

  func(2)  # [1,2,3,1,2]

  第二种情况:

  def func(x,l = []):

    for i in range(x):

      l.append(i+1)

    print(l)

  list = [1,2]

  func(3,list)  # [1,2,1,2,3]

  func(2)  #  [1,2]

  函数有默认参数,定义时即为默认参数分配地址了,也只分配这一个地址,所以第一种情况,用的全是l这个列表;第二种调用func(3,list),将list变为了[1,2,1,2,3],然后调用func(2),l又指向了原先的已经定义好的空列表,所以结果为[1,2]。

python 05 关于对python中引用的理解的更多相关文章

  1. Python中在脚本中引用其他文件函数的方法

    在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址.所以如果要在当前脚本引用其他文件,除了将文件放在和 ...

  2. shell基础概念, if+命令, shell中引用python, shell脚本的几种执行方式

    说明: 虚拟机中shell_test目录用来练习shell, 其中有个test.log文件用来存放日志 #!/usr/bin/bash      # shell文件开头, 用来指定该文件使用哪个解释器 ...

  3. python函数定义中引用外部变量的一个问题

    如果在函数定义的默认值中引用了一个外部变量,如下所示 x = 3 def func(a = x): print(a, x) 那么a的默认值就会是3, 但是print语句中的x会是调用时的x值 lamb ...

  4. java和python细节总结和java中string 的+操作

    //JAVA中对arrayList的初始化,能够分配空间,不能之间让一个ArrayList赋值给另外一个ArrayList,这样是引用赋值,当一个改变时候,另外一个也改变 List<String ...

  5. (Python)导出指定文件夹中as文件的完全限定类名

    AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译 ...

  6. [Python][flask][flask-wtf]关于flask-wtf中API使用实例教程

    简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(Install) 此文仍然是Windows操作系统下的教程,但是和linux操作系统下的运行环境 ...

  7. python调用shell, shell 引用python

    python 调用 shell get_line_num="wc -l as_uniq_info | awk '{print $1}'" ###get the lines of & ...

  8. python笔记之提取网页中的超链接

    python笔记之提取网页中的超链接 对于提取网页中的超链接,先把网页内容读取出来,然后用beautifulsoup来解析是比较方便的.但是我发现一个问题,如果直接提取a标签的href,就会包含jav ...

  9. 【Python 05】Python开发环境搭建

    Python3安装和使用 1.安装 Python管方下载地址 选择Customize installation安装,并且勾选Add Python 3.X to PATH. 勾选Documentatio ...

随机推荐

  1. 1.基础数据类型的初识 字符串 bool 整型 if else elif

    ---恢复内容开始--- 计算器基础知识 cpu :人类的大脑 运算和处理问题 内存:临时存储数据 断点就消失了 高铁 硬盘:永久存储数据 图片 操作系统:是一个软件 控制每个硬件之间的数据交互 Py ...

  2. Java 反射机制详解(下)

    续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...

  3. ipset 学习总结

    用途:当机器受到网络攻击时,使用 iptables 封 IP,有时候可能会封禁成千上万个 IP,如果添加成千上万条规则, 在一台注重性能的服务器或者本身性能就很差的设备上就不在适用了.ipset 就是 ...

  4. Scipy-数值计算库

    Scipy在Numpy的基础上则加了众多的数学计算,科学计算以及工程计算中常用的模块,例如线性代数,常微分方程的数值求解,信号处理,图像处理,系数矩阵等.在本章中,将通过实例介绍Scipy中常用的的一 ...

  5. zabbix网络发现主机

    1 功能介绍 默认情况下,当我在主机上安装agent,然后要在server上手动添加主机并连接到模板,加入一个主机组. 如果有很多主机,并且经常变动,手动操作就很麻烦. 网络发现就是主机上安装了age ...

  6. Python递归实现遍历目录

    import os filePath = "/Users/busensei/wzy/filePath/" def read(filePath, n): it = os.listdi ...

  7. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  8. Painful Bases LightOJ - 1021

    Painful Bases LightOJ - 1021 题意:给出0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F中的一些字符(不重复)还有一个进制base,求这些字符的排列形成的ba ...

  9. 解题报告:poj 3259 Wormholes(入门spfa判断负环)

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  10. 在sz

    在大城市,sz, 每天骑单车去公交车站. 每天用高德地图 坐快线巴士 车上下班要3个小时. 用guomei 的回收管家 回收 旧空调. 我在kfc 看书 在班车上睡觉/眯眼 在办公室睡觉,看书,工作 ...