Python参数传递(传值&传引用)

# 测试参数是传值还是传引用
def test(arg):
  print("test before")
  print(id(arg))
  arg[1]=30 # 测试可变对象
  # arg[3][2] = 16 # 测试嵌套类型
  # arg = list(range(5))
  print("test after")
  print(id(arg))
  return arg
change_loc = 1
if change_loc == 1:
  # 传入可变对象
  my_list = list(range(5))
  print(my_list)
  print(id(my_list))
  test(my_list)
  print(my_list)
  print(id(my_list))
else:
  # 传入不可变对象(元组中嵌套列表)
  my_tuple = (3,5,"abc",my_list) # list(range(6)不能在元组中直接写创建列表可以替换成创建好的列表对象
  print(my_tuple[3][2]) # 要测试修改的元组中列表的某个元素
  print(id(my_tuple)) # 传入前元组引用
  print(id(my_tuple[3])) # 传入前元组中列表引用
  test(my_tuple)
  print(my_tuple[3][2]) # 要测试修改后的元组中列表的某个元素
  print(id(my_tuple)) # 传入后元组引用
  print(id(my_tuple[3])) # 传入后元组中列表引用
# Python参数传递采用的是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。
# 如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。
# 如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值‘来传递对象。

总结:函数传值时如果传不可变对象,就不能修改原始值;传可变变量就能改原始值。如果传嵌套的数据类型(例如:("you",[‘Jack‘, ‘Rose‘])) 元组中包含列表或[{‘Tom‘, ‘Jim‘, ‘Mary‘},{‘Jack‘, ‘Rose‘}] 列表中包含集合等)修改限制从外及内,直接相连的两层外层限制内层,不直接相连的没有直接影响。就拿元组包含列表为例:元组不能直接修改,因此元组内的各个数据的引用不能修改;列表支持修改,因此可以修改元组内列表中的数据,这并不影响元组本身的不可修改性,因为列表的引用没变;元组对其内列表中的数据没有直接影响力,其它嵌套结构分析类似!!!

测试结果:

原文地址:https://www.cnblogs.com/yszd/p/9149846.html

时间: 2024-10-05 14:29:26

Python参数传递(传值&传引用)的相关文章

关于Java传值&传引用的一道题

<pre name="code" class="java">public class JavaTestDemo1 { public static void main(String[] args) { Integer v1 = new Integer(1); Integer v2 = v1; doSomething(v2); System.out.println(v2); System.out.println(v1 == v2); System.out.p

【转载】Java是传值还是传引用

1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void test(boolean test) { test = ! test; System.out.println("In test(boolean) : test = &q

python函数传参是传值还是传引用?

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

Python 中函数传参是传值还是传引用

直接简单的例子: 1 from ctypes import * 2 import os.path 3 import sys 4 5 def test(c): 6 print "test before " 7 print id(c) 8 c+=2 9 print "test after +" 10 print id(c) 11 return c 12 13 def printIt(t): 14 for i in range(len(t)): 15 print t[i]

Python 函数参数引用(传值/传址)/copy/deepcopy

精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如果是列表,字典则传址: copy使用场景:列表或字典,且内部元素为数字,字符串或元组 deepcopy使用场景:列表或字典,且内部元素包含列表或字典 完整版: 1.传值和传址的区别 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里

python传参是传值还是传引用

在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象.而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的.例如,a = []是一个空列表对象,变量 a 是该对象的一个引用 例1 def test(c): c.append("hello world") print(c,id(c)) return list = [1,2] test(list) print(list,id(list)) 输出 [1,

python中给函数传参是传值还是传引用

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

java传递参数是传值还是传引用

这个问题,网上一查越看越迷糊,纠结完了先总结下 先看个栗子: 1 public class Example { 2  3     public void change(String str1, StringBuffer sbr1, char[] ch1, int a) { 4         str1 = "world"; 5         sbr1.append("world"); 6         ch1[0] = 'g'; 7     } 8  9    

Java经典问题:传值与传引用?

转自:http://developer.51cto.com/art/201104/254715.htm Java到底是传值还是传引用?相信很少有人能完全回答正确.通常的说法是:对于基本数据类型(整型.浮点型.字符型.布尔型等),传值;对于引用类型(对象.数组),传引用.基本类型传值,所有人都不会对此有疑义;问题出在引用类型上. 为引入正题,不妨先看看下面的例子,你能正确给出程序的运行结果嘛? /** * @(#)Swap.java * * *  @author *  @version  1.00