返回顶部
首页 > 资讯 > 精选 >如何通过引用传递变量?
  • 446
分享到

如何通过引用传递变量?

作用域 2024-02-09 20:02:40 446人浏览 独家记忆
摘要

问题内容 我编写这个类是为了测试: class PassByReference: def __init__(self): self.variable = 'Or

问题内容

我编写这个类是为了测试

class PassByReference:
    def __init__(self):
        self.variable = 'Original'
        self.change(self.variable)
        print(self.variable)

    def change(self, var):
        var = 'Changed'

当我尝试创建实例时,输出是 original。所以python中的参数似乎是按值传递的。那是对的吗?如何修改代码才能达到引用传递的效果,使得输出为changed

有时人们会感到惊讶,像 x = 1 这样的代码(其中 x 是参数名称)不会影响调用者的参数,但像 x[0] = 1 这样的代码却会影响调用者的参数。发生这种情况是因为尽管有 = 语法,但项目分配切片分配变异现有对象的方法,而不是重新分配变量。请参阅为什么函数可以修改调用者感知到的某些参数,但不能修改其他参数?了解详情。

另请参阅按引用传递与按值传递之间有什么区别?用于重要的、与语言无关的术语讨论。


正确答案


参数是通过赋值传递。这背后的理由有两个:

  1. 传入的参数实际上是对象的引用(但引用是按值传递的)
  2. 某些数据类型是可变的,但其他数据类型则不然

所以:

  • 如果将一个可变对象传递给方法,该方法将获得对同一对象的引用,并且您可以随心所欲地改变它,但是如果您在方法时,外部作用域对此一无所知,完成后,外部引用仍将指向原始对象。

  • 如果将不可变对象传递给方法,您仍然无法重新绑定外部引用,甚至无法更改该对象。

为了更清楚地说明这一点,让我们举一些例子。

列表 - 可变类型

让我们尝试修改传递给方法的列表:

def try_to_change_list_contents(the_list):
    print('Got', the_list)
    the_list.append('four')
    print('changed to', the_list)

outer_list = ['one', 'two', 'three']

print('before, outer_list =', outer_list)
try_to_change_list_contents(outer_list)
print('after, outer_list =', outer_list)

输出:

before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']

由于传入的参数是对 outer_list 的引用,而不是它的副本,因此我们可以使用变异列表方法来更改它,并将更改反映在外部范围中。

现在让我们看看当我们尝试更改作为参数传入的引用时会发生什么:

def try_to_change_list_reference(the_list):
    print('got', the_list)
    the_list = ['and', 'we', 'can', 'not', 'lie']
    print('set to', the_list)

outer_list = ['we', 'like', 'proper', 'english']

print('before, outer_list =', outer_list)
try_to_change_list_reference(outer_list)
print('after, outer_list =', outer_list)

输出:

before, outer_list = ['we', 'like', 'proper', 'english']
got ['we', 'like', 'proper', 'english']
set to ['and', 'we', 'can', 'not', 'lie']
after, outer_list = ['we', 'like', 'proper', 'english']

由于 the_list 参数是按值传递的,因此为其分配新列表不会对方法外部的代码产生任何影响。 the_listouter_list 引用的副本,我们让 the_list 指向一个新列表,但无法更改 outer_list 指向的位置。

字符串 - 不可变类型

它是不可变的,因此我们无法更改字符串的内容

现在,让我们尝试更改引用

def try_to_change_string_reference(the_string):
    print('got', the_string)
    the_string = 'in a kingdom by the sea'
    print('set to', the_string)

outer_string = 'it was many and many a year ago'

print('before, outer_string =', outer_string)
try_to_change_string_reference(outer_string)
print('after, outer_string =', outer_string)

输出:

before, outer_string = it was many and many a year ago
got it was many and many a year ago
set to in a kingdom by the sea
after, outer_string = it was many and many a year ago

同样,由于 the_string 参数是按值传递的,因此为其分配新字符串不会对方法外部的代码看到任何影响。 the_stringouter_string 引用的副本,我们让 the_string 指向一个新字符串,但无法更改 outer_string 指向的位置。

我希望这能让事情变得更清楚。

编辑:有人指出,这并没有回答 @david 最初提出的问题:“我可以做些什么来通过实际引用传递变量吗?”。让我们努力吧。

我们如何解决这个问题?

正如@andrea的回答所示,您可以返回新值。这不会改变传入内容的方式,但可以让您获取想要的信息:

def return_a_whole_new_string(the_string):
    new_string = something_to_do_with_the_old_string(the_string)
    return new_string

# then you could call it like
my_string = return_a_whole_new_string(my_string)

如果您确实想避免使用返回值,您可以创建一个类来保存您的值并将其传递给函数或使用现有的类,例如列表:

def use_a_wrapper_to_simulate_pass_by_reference(stuff_to_change):
    new_string = something_to_do_with_the_old_string(stuff_to_change[0])
    stuff_to_change[0] = new_string

# then you could call it like
wrapper = [my_string]
use_a_wrapper_to_simulate_pass_by_reference(wrapper)

do_something_with(wrapper[0])

虽然这看起来有点麻烦。

以上就是如何通过引用传递变量?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 如何通过引用传递变量?

本文链接: https://lsjlt.com/news/562773.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何通过引用传递变量?
    问题内容 我编写这个类是为了测试: class PassByReference: def __init__(self): self.variable = 'Or...
    99+
    2024-02-09
    作用域
  • PHP 变量通过引用传递
    变量默认按值传递给函数,但在 PHP 中也可以通过引用传递。本文演示如何在 PHP 中通过引用传递。 PHP 变量通过引用传递 & 符号 & 将添加到变量参数的开头,以便在 PH...
    99+
    2024-02-27
  • PHP 通过引用与通过值传递变量
    在 PHP 中,我们可以通过两种不同的方式将变量传递给函数:按值和按引用。 了解这两种传递变量的方法之间的区别对于编写高效且有效的 PHP 代码很重要。 按值传递变量 默认情况下,PHP 按值将...
    99+
    2024-02-27
  • 如何通过C#引用传递
    这篇文章主要介绍“如何通过C#引用传递”,在日常操作中,相信很多人在如何通过C#引用传递问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何通过C#引用传递”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#...
    99+
    2023-06-17
  • 在 Go to 函数中通过引用和值传递
    在PHP开发中,Go to 函数是一个非常常用的函数,可以用于控制程序的流程。在使用Go to函数时,我们有两种传递参数的方式:通过引用和通过值传递。通过引用传递参数时,函数内部对参数...
    99+
    2024-02-13
  • Flask如何使用全局变量传递数据
    这篇“Flask如何使用全局变量传递数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Fl...
    99+
    2024-04-02
  • C++ 函数中的 lambda 表达式如何通过参数传递捕获外部变量?
    c++++ lambda 表达式可以通过参数传递来捕获外部变量,具体步骤如下:定义一个接受 lambda 表达式作为参数的函数。在 lambda 表达式中捕获外部变量。将 lambda ...
    99+
    2024-04-25
    lambda 捕获外部变量 c++
  • 在Java中字符串是通过引用传递的吗
    本篇内容介绍了“在Java中字符串是通过引用传递的吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 一...
    99+
    2024-04-02
  • php如何通过变量调用方法
    这篇“php如何通过变量调用方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何通过变量调用方法”文章吧。1.使用可...
    99+
    2023-07-06
  • SpringBoot如何通过Feign调用传递Header中参数
    目录【SpringBoot】通过Feign调用传递Header中参数如何通过Feign传递Header参数问题描述解决方案【SpringBoot】通过Feign调用传递Header中...
    99+
    2023-05-17
    SpringBoot Feign调用传递Header参数 SpringBoot Feign调用参数
  • 微服务如何通过feign.RequestInterceptor传递参数
    目录微服务通过feign.RequestInterceptor传递参数创建自定义请求拦截器具体获取逻辑如下feign的拦截器RequestInterceptor首先创建自定义的Req...
    99+
    2024-04-02
  • Python如何通过变量ID得到变量的值
    目录通过变量ID得到变量的值如何查看一个变量的id用id()函数通过变量ID得到变量的值 已知获得变量的id用函数id(),那么它的反函数是什么? 答案是:PyObj_FromPtr...
    99+
    2024-04-02
  • mysql通过@变量实现递归详细实例
    目录1. 测试表结构2. 向下递归(包括自己)3.向下递归(不包括自己)4. 向下递归可能存在问题,修正优化:5. 向上递归所用函数介绍:1、GROUP_CONCAT([distinct] colName)2、F...
    99+
    2023-06-08
    mysql如何实现递归 mysql递归sql mysql @变量
  • SpringCloud如何通过Feign传递List类型参数
    小编给大家分享一下SpringCloud如何通过Feign传递List类型参数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过Feign传递List类型参数首先...
    99+
    2023-06-29
  • Java sum传递该如何完成成员变量
    这篇文章给大家介绍Java sum传递该如何完成成员变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java sum传递需要我们不断的学习,当然我们在学习中会有很多的问题需要我们解决。下面我们就详细的来看看不能更好的...
    99+
    2023-06-17
  • PHP 中如何将变量传递到下一页
    PHP 变量是等于某一值的符号或名称。它用于存储值,例如值,数字,字符或内存地址,以便可以在程序的任何部分中使用它们。一个简单的变量可以在程序的任何部分中使用,但是在它的外部无法访问,除非它通过 HTML ...
    99+
    2024-02-27
  • angular2 组件之间如何通过service互相传递
    这篇文章主要介绍angular2 组件之间如何通过service互相传递,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!母组件传值给子组件母组件通过service传值给子组件,很简单,...
    99+
    2024-04-02
  • Ajax中如何通过response在后台传递数据
    这篇文章主要为大家展示了“Ajax中如何通过response在后台传递数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Ajax中如何通过response在后台...
    99+
    2024-04-02
  • 如何通过字符串变量调用方法?
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《如何通过字符串变量调用方法?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回...
    99+
    2024-04-05
  • 通过引用改变接口值
    php小编百草在这里为大家介绍一种通过引用改变接口值的方法。在编程中,有时候我们需要改变一个函数或方法的参数,但是又不希望直接返回一个新的值,而是希望通过引用的方式修改原来的值。这种情...
    99+
    2024-02-14
    overflow
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作