首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

巨蟒。为什么我传递的变量没有被更新?它们不是通过引用传递的吗?

巨蟒(Python)是一种高级编程语言,具有简洁、易读、易学的特点,被广泛应用于前端开发、后端开发、数据科学、人工智能等领域。下面是关于为什么传递的变量没有被更新的解释:

在巨蟒中,变量的传递方式可以分为值传递和引用传递两种。对于不可变类型的变量(如数字、字符串、元组),采用的是值传递方式,即传递的是变量的值副本,而不是变量本身。因此,当你在函数内部修改这些不可变类型的变量时,实际上是创建了一个新的变量,而原始变量并没有被修改。

而对于可变类型的变量(如列表、字典、集合),采用的是引用传递方式,即传递的是变量的引用,函数内部对变量的修改会影响到原始变量。但需要注意的是,如果在函数内部对可变类型的变量进行重新赋值操作(如使用赋值运算符=),那么会改变变量的引用,使其指向一个新的对象,而不会影响到原始变量。

所以,当你传递一个可变类型的变量到函数中,并在函数内部对其进行修改时,变量会被更新。但如果你传递的是不可变类型的变量,或者在函数内部对可变类型的变量进行重新赋值操作,那么变量不会被更新。

为了解决这个问题,你可以考虑以下几种方法:

  1. 返回修改后的变量值,并在函数外部进行赋值操作。
  2. 将可变类型的变量作为函数的参数,并在函数内部直接修改它。
  3. 使用全局变量,在函数内部声明变量为全局变量,并在函数内部修改它。

总结起来,巨蟒中的变量传递方式取决于变量的类型,对于不可变类型的变量采用值传递,对于可变类型的变量采用引用传递。因此,当传递的变量没有被更新时,可能是因为传递的是不可变类型的变量,或者在函数内部对可变类型的变量进行了重新赋值操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一文理清 Go 引用常见疑惑

Go 中有引用类型?什么是值传递?址传递引用传递? 在开始谈论之前,已经感觉到这必定是一个非常头疼的话题。这或许就是学了那么多语言,但没有深入总结,从而导致思维混乱。...相当绕人是不是已经感觉到自己头发在掉了。其实,要想彻底搞清楚这些概念,还是得从本质出发。 值和指针 先来搞明白值与指针区别。 上一节在介绍指针时候,提到了要注意变量地址和内容不同。...参考值传递定义,实参地址在函数调用传递给形参,针对形参操作,影响到了实参,则可以认为是引用传递。 在用过语言中,支持引用传递语言有 PHP 和 C++。...最初也迷糊,Go 不是有指针和引用类型。但读了一些文章,思考了许久,才彻底想明白。下面,将尝试为官方说法找个合理解释。...但于 Go 而言,指针已经弱化了很多,Go 团队可能也觉得没有必要再单独强调指针地位。 为什么说 Go 中没有引用传递

49730

50道JavaScript详解面试题,你需要了解一下

答案是输出为10,因为将对象传递给函数时对象相似,仅传递其值,而不传递对内存位置实际引用。这就是为什么更改仅影响函数范围内参数原因。 3、控制台输出是什么?...typeof在右侧使用变量名称, instanceof在左侧和右侧使用值,而不是。 答案是B,因为它们都不要求TypeScript,并且两者都不是JavaScript固有的。...控制台输出将为'Mohit',因为内部函数有权访问在外部作用域中声明变量。 27、函数引用自身进行递归三种方式是什么?...但是,可以在JavaScript中通过在未将所有可能参数都传递给函数时返回不同输出来执行重载。 29、return语句在数组forEach循环中做什么?...阴影DOM API提供了一种隐藏单独DOM,附加到不是通过正常访问元件JS DOM操作API。它提供Web组件封装。

3.5K40

2019年Java面试题基础系列228道(1),快看看哪些你还不会?

18、当一个对象当作参数传递到一个方法后,此方法可改变这个对象属性,并可返回变化后结果,那么这里到底是值传递还是引用传递?...102、在没有使用临时变量情况如何交换两个整数变量值? 103、接口是什么?为什么要使用接口而不是直接使用具体类? 104、Java 中,抽象类与接口之间有什么不同?...首先需要注意是 f1、f2、f3、f4 四个变量都是 Integer 对象引用,所以下面的==运算比较不是值而是引用。装箱本质是什么呢?...18、当一个对象当作参数传递到一个方法后,此方法可改变这个对象属性,并可返回变化后结果,那么这里到底是值传递还是引用传递? 是值传递。Java 语言方法调用只支持参数传递。...当一个对象实例作为一个参数传递到方法中时,参数值就是对该对象引用。对象属性可以在被调用过程中被改变,但对对象引用改变是不会影响到调用者

1.1K00

Java大型互联网公司经典面试题,论JDK源码重要性无限思考

题目的意思是:定义了两个Integer类型变量通过swap方法交换这两个变量值。 看似简单题目,是不是不知道从何下手,猜想有些大家第一想到是这样解法:来看代码: ? 运行结果如下: ?...引用传递传递是指向值地址指针 那么,请问大家,这里是按值传递还是引用传递?好,老司机告诉你们,这里是按值传递为什么?Integer不是对象? 对象传递不是传递指针?...结果是,a值确实变了,但是b值却没有变,首先说明通过这种方式确实可以改变值,但是为什么b没有变化呢?。请问为什么?我们再回过头来看看外面的方法,检查一下,我们定义了: ?...那么我们按照正常来写是不是这样子: int a = 1; 但是为什么使用Integer也不会报错了,好,这就讲到了我们又一个知识点:(笔记) Java中装箱和拆箱 装箱:把基本类型用它们相应引用类型包装起来...结果为:false 那么,这个当时其实又遇到这个坑,坑惨了是吧。哈哈哈。 那么我们怎么解决最后问题:(最初面试问题) 1. ? 2. ? 3.取巧方式: ? 好啦。到此结束啦!

1K10

C语言中常见指针问题集解答

要自增 p 指向值, 使用(*p)++, 如果副作用顺序无关紧要也可以使用 ++*p。 3. 有一个char*型指针正巧指向一些int型变量,想跳过它们为什么如下代码不行?...int *ip; f(ip); 答:你确定函数初始化是你希望它初始化东西?请记住在 C 中, 参数是通过传递调函数仅仅修改了传入指针副本。...你需要传入指针地址 (函数变成接受指针指针), 或者让函数返回指针。 5. 能否用void**指针作为参数, 使函数按引用接收一般指针? 答:不可以。C中没有一般指针指针类型。...C有“按引用传递? 答:真的没有。严格地讲,C总是按值传递。你可以自己模拟按引用传递, 定义接受指针函数,然后在调用时使用 & 操作符。...事实上,当你向函数传入数组时,编译器本质上就是在模拟按引用传递。但是 C 没有任何真正等同于正式引用传递或 C++ 引用参数东西。

52040

教你如何在 React 中逃离闭包陷阱 ...

什么是过期闭包,它们为什么会出现。 React 中导致过期闭包常见场景是什么,以及如何应对它们。...如果尝试对 onClick 回调使用 Ref 而不是 useCallback 钩子,会发生什么情况呢?有些文章会建议通过这样做来 memoize 组件上 props。...我们 ref 在创建时只会初始化一次,并且不会自行更新。这基本上就是我们一开始创建逻辑,只是我们传递不是值,而是我们想要保留函数。...我们在 onClick 中值从未更新过,你能告诉为什么? 当然,这又是一个过期闭包。当我们创建 onClick 时,首先使用默认状态值(undefined)形成闭包。...但是,当闭包冻结周围一切时,并不会使对象不可变或冻结。对象存储在内存不同部分,多个变量可以包含对完全相同对象引用

51240

Java中真的只有值传递么?

在谈这个问题之前我们先了解值传递引用传递概念及现象。还记得,值传递引用传递这些概念是大学里学Java时候老师教给我它们概念是什么呢?老师是通过例子来讲解,大概是这样。...通过看控制台输出,main()方法中num变量没有改变。 结论:基本类型是值传递。...所以,其实String类型传引用,只不过重新赋值指向了别的对象了,没有修改原对象。即,String本质上还是引用传递,表像上是值传递。...解析 觉得论证者分析基本类型和引用类型实参形参变化原理是没有问题,但是得出结论是不是有点不恰当。怎么说呢?请继续看。 论证者意思是,java只有值传递。...传递引用值,计算机中不全是值不是值还能是什么,说是引用传递是侧重点不同传,传过去就是地址就是引用引用不用值表示用啥 这里说不是一个概念,说基本类型传是值,这个是值变量本身值,说对象传也是值

1.1K20

Java有值类型

Java,Scheme 等语言原始类型,比如 char,int,boolean,double 等,在“实现”上确实是通过值(而不是引用,或者叫指针)直接传递,然而这完全是一种为了效率优化(叫做 inlining...这种优化对于程序员应该是不可见。Java 继承了 Scheme/Lisp 衣钵,它们在“语义”上其实是没有值类型。 这不是天方夜谭,为了理解这一点,你可以做一个很有意思思维实验。...然后你会发现这样“改造后” Java,仍然符合现有 Java 代码里能看到一切现象。也就是说,原始类型作为值类型还是引用类型,对于程序员完全没有区别。...这两种事情,就跟你能对值类型能做两件事情没有区别。这就是为什么你没法通过对 x 操作而改变 y 表示值。所以不管 int 在实现上是传递值还是传递引用它们在语义上都是等价。...思考题 有人指出,Java 引用类型可以是 null,而原始类型不行,所以引用类型和值类型还是有区别的。但是其实这并不能否认本文指出观点,你可以想想这是为什么

5.6K20

C++初阶 类和对象(下)

前言:C++初阶系列,每一期博主都会使用简单朴素语言将对应知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更 一、拷贝构造函数 1.1 什么是拷贝构造函数...拷贝构造函数只有单个形参,该形参是对本类类型对象引用(一般常用const修饰),在用已存在类类型对象创建新对象时由编译器自动调用。 1.2 为什么得是引用?...为什么这个形参得是类对象引用呢,直接传递这个要拷贝目标不可以不是一样操作。...,至于为什么要加const是因为我们传递过去变量拷贝,是不会被修改 加个const是为了避免一些低级错误发生,比方说修改到了拷贝对象,同时增加了代码可读性。...return tmp; } 2.3.3前置++和后置++运算符重载 在C++中前置++和后置++如果我们要对它进行重载,你就会惊讶发现,它们运算符名字其实是一模一样,这怎么进行区分呢,祖师爷其实也没有太好办法

14910

C++初阶 入门(2)

1.3使用缺省函数 大致了解了一下缺省函数,接下来让我们实践一下,比方说要计算一批长方体体积,但它们大部分长宽均为5,高度全都不同。...2.2为什么要有函数重载 看完概念小伙伴一定会有一个疑惑,那就是这个函数重载它有用,在学习c时候老师严肃强调一件事就是绝对不要创建相同名字函数或者是相同名字变量,否则会导致编译器识别紊乱。...3.1什么是引用 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用变量共用同一块内存空间。...通过图片可以看出,a是b,b也是a,b和a本质是一样 打印地址更是强有力证明了我们观点 必须重视几点 1.引用在定义时必须要初始化 2.一个变量可以有多个引用,就像一个人可以有多个外号一样...引用概念上定义一个变量别名,指针存储一个变量地址。 2. 引用在定义时必须初始化,指针没有要求 3.

13510

初级程序员面试不靠谱指南(三)

地址不一样,说明了编译器给pointer分配了一个内存单元,而ref_i没有,这里就是它们第一个不同点,编译器会给指针分配一个内存单元,而对于引用不会,所以说ref_i所表示都不能称之为一个变量或什么...有一点需要强调是,在C语言中,不能使用类似swap1(int &i,int &j)这样形式,因为C语言中没有按址传递概念,它通过传递指针实现按址传递,但是其本质还是传递值,只不过传递是一个地址值...int &b=7;     你可以先试试,答案可能是不能通过编译,因为7是一个常量,自然需要一个常量引用,所以正确写法应该是const int& b=7,那么这个引用没有分配内存呢?...如果你试着输出会发现其分配了一个内存,你可能要说不是引用不会被分配内存?但是这里分配内存是这个常量'7',而不是引用b,所以这一点和前面所论述并不矛盾。    ...,所以,a变量值被覆盖了,至于为什么不是0,这个问题在这里展开就太多了,你可以试试在你注释掉所有的cout和test语句中,就能得到正确结果。

71390

26 TIPS IN PYTHON

bashplotlib 你想在控制台中绘制图表? ? 你就可以在控制台中画出图表了。 collections python有一些很好默认数据类型,但有时它们表现不如你期望哪样。...这些表达式使得容易编写非常干净代码,读起来几乎像自然语言。 你可以在这里阅读更多关于如何使用它们信息。 ? map python通过许多内置特性支持功能编程。...有没有想过python为什么允许你使用"+"运算符来相加数字以及连接字符串?这就是运算符重载。 你可以用特殊方法定义使用Python标准运算符符号对象。...定义变量、函数、类等时,不需要指定数据类型。 这有助于缩短开发时间。然而,没有什么比简单类型问题导致运行错误更令人讨厌了。 自Python 3.5以来,你可以选择在定义函数时提供类型提示。 ?...虽然这不是强制性,但是类型注释可以让你代码更容易理解。 它们还允许你在运行之前使用类型检查工具来捕获这些杂散类型错误。如果你正在进行大型复杂项目,这很值得使用!

1.5K30

女朋友问我:小松子,你知道Go语言参数传递是传值还是传引用

前言 哈喽,大家好,是asong。今天女朋友问我,小松子,你知道Go语言参数传递是传值还是传引用?...哎呀哈,竟然瞧不起了,立马一顿操作,给他讲明明白白,小丫头片子,还是太嫩,大家且听我细细道来~~~。 文末留了一道思考题,请留下你答案!!!...通过上面的分析,我们就可以确定go就是值传递,因为我们在modifieNumber方法中打印出来内存地址发生了改变,所以不是引用传递,实锤了奥兄弟们,证据确凿~~~。...map我们可以通过方法修改它内容,并且它没有明显指针。...在这里,Go语言通过make函数,字面量包装,为我们省去了指针操作,让我们可以更容易使用map。这里map可以理解为引用类型,但是记住引用类型不是引用。 chan是值传递

33210

用 React 和 Vue 构建了同款应用,来看看哪里不一样(2020 版)

想尽量保持中立,通过这样例子来告诉大家这两种技术执行特定任务时是怎样做。 当 React Hooks 发布时,为这篇文章更新了 “2019 版”,用函数式 Hooks 取代了类组件。...在应用中,我们将调用 name.value 来引用它。如果要使用在 ref() 函数内部创建值,我们将在变量上寻找.value 而不是简单地调用该变量。...换句话说,如果我们想要一个持有状态变量值,我们将寻找 name.value 而不是 name。如果要更新 name 值,可以通过更新 name.value 来完成。...你可能觉得…list 看起来很奇怪:开头三个点称为 spread 运算符,负责将 list 中所有值作为单独项目传递,而不是简单地把所有项目打包在一起作为数组传递。感觉有些糊涂?...从这里开始,我们就可以通过 this.props 在子组件中引用它们。因此要访问 item.todo prop 时,我们只需调用 props.item。

4.8K30

Java传值调用

探讨了网上关于Java只有值传递说法,当时写这篇文章缘由是因为之前看文章讲解Java只有值传递,讲不是很明白,没有拿出比较专业解释或定义,没有说服。...通过看控制台输出,main()方法中num变量没有改变。 结论:实参没有形参影响,基本类型是值传递。...通过看控制台输出,main()方法中user变量name属性值发生改变。 结论:形参变了实参也变了,引用类型是引用传递。...所以,其实String类型传引用,只不过重新赋值指向了别的对象了,没有修改原对象。即,String本质上还是引用传递,表像上是值传递。...因为列表是可变,append方法改变了m。而赋值局部变量l行为对外面作用域没有影响(在这类语言中赋值是给变量绑定一个新对象,而不是改变对象)。

3.5K20

前端阿瓜每周速记(2020 第 34 周)

传递引用传递、解释型、编译型 知道你知道,JS 值有两大类型:基本类型和引用类型。基本类型按值传递引用类型按引用传递。非常优秀,背简直不要太熟,但你有想过为什么要这么划分?...这些变量保存在哪里?内存中? 内存分配策略是如何呢? 为什么是内存,不是 CPU?不是外存?本瓜在面试中被问过,面试官多半是后端或架构师 不要方,抱紧。芜湖起飞!...这种传递方式叫做共享传递 Stack Overflow 解释:对于传递到函数参数对象类型,如果直接改变了拷贝引用指向地址,那是不会影响到原来那个对象;如果是通过拷贝引用,去进行内部操作...为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。———— MDN (os:还用说什么?“JS是最好语言”打在评论中。)...类型 回顾三种 XSS 类型: DOM 型(DOM XSS),即用户输入没有提交到服务器,只是前端js接收并显示所引起XSS。

63730

新手入门C语言编程:使用函数必须知道三点注意事项!

所以C与C++最大区别在于它们用于解决问题思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经融入到C++之中 ”。...那么是不是C就不重要了,错!算法是程序设计基础,好设计如果没有算法,一样不行。而且,“C加上好设计”也能写出非常好东西。 C 语言中函数使用注意事项,你们知道?...这个函数是错误,因为函数在进行参数传递时候,会将传入参数 m,n 值拷贝给函数形式参数 a,b。 因此在函数内部交换是形式参数 a,b 值,而不是交换传递时 m,n 变量值。...因为我们这里传递是 m,n 内存地址,即传递是指针,所以在函数内部对指针解除引用就可以直接访问这个地址内容了,这是指针提供特性。 那么是否就意为着传递指针就没有副本机制了呢?...只不过这里拷贝是地址而不是值,在内部通过指针引用操作可以直接访问 m,n 内存地址,进而进行交换。

1.1K20

还记得指针与引用?说下呗!

引用没有const引用。 ⑥关于sizeof "sizeof指针":得到是指针本身大小。 "sizeof引用":得到是所指向变量(对象)大小。...当把指针作为参数进行传递时,也是将实参一个拷贝传递给形参,即上面程序main函数中p和test函数中使用p不是同一个变量,存储2个变量p单元也不相同(只是2个p指向同一个存储单元)。...在讲引用作为函数参数进行传递时,实质上传递是实参本身,而不是实参拷贝,对形参修改就是对实参修改。因此在用引用进行参数传递时,不仅节约时间,而且可以节约空间。...,事实上传递是实参本身,而不是拷贝。...fr=aladdin 有趣经验分享 互联网你们,还想要读博? 挖年薪60w腾讯同学来做技术VP 算法岗,不会写简历?把它拆开,手把手教你写! (算法从业人员必备!)

51030

临时变量作为非const引用进行参数传递引发编译错误

其中文意思为临时变量无法为非const引用初始化。也就是在参数传递过程中,出现错误。...---- 2.所有的临时对象都是const对象 为什么临时对象作为引用参数传递时,必须是常量引用呢?很多人对此解释是临时对象是常量,不允许赋值改动,所以作为非常量引用传递时,编译器就会报错。...事实上,临时变量是可以作为左值(LValue) 并赋值,请看下面的代码: class IntClass{ private: int x; public: IntClass(int...IntClass(6)表示生成一个无名临时对象,传递给非const引用,在print函数中通过引用修改了这个临时对象。这说明了并非所有的临时对象都是const对象。...这里贴上摘自网上一句话:“内置类型产生临时变量具有常性,而自定义类型产生临时变量不具有常性”,想这句话能解释你所谓临时变量为什么能作为左值原因。”

2.4K31

用画小狗方法来解释Java中传递

myDog真的就是一只狗?不!不是!myDog只是一条遛狗用狗绳! ? 换句话说说,myDog并不是new出来放在堆中对象(object)!...参数传递 现在你知道了,myDog只是一条绳子,但这似乎并不能解释为什么changeName方法没有把myDog名称改为“小强”,因为按照现有的理解,dog = new Dog(),就是把狗绳绑到另一只小狗身上...这个 = 操作,是值传递引用传递根本差别,这也导致了值传递引用传递有以下直观上差别: 如果参数是值传递,那么调用者(方法体外部)和调用者(方法体内部)用是两个不同变量,方法体里面对变量改动不会影响方法体外面的变量...如果参数是引用传递,那么调用者(方法体外部)和调用者(方法体内部)用是两个相同变量,方法体里面对变量改动会影响方法体外面的变量。...Java变量不是对象 通过上面的讲解,你也知道了一个很重要点:Java里面的变量,要么是基本数据类型,要么是指向对象实例引用类型(狗绳),绝对不会是一个对象(狗)。

87020
领券