计算机与python程序设计基础

参数为可变数据类型,是引用传递(地址传递)。那为什么说python不支持地址传递

img

一共就两种传参方式,一种是位置传参,一种是名称传参
哪里来的地址传参
地址传递和地址传参是一回事吗,不要望文生义

python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合

def func(a, b)      #位置参数
def func(a, b=2)    #默认参数,也叫名称参数
def calc(*nums)     #可变参数,即可以传递过个参数到函数中
def person_info(name, age, **kwargs)   #用两个星号表示关键字参数
def  person_info(name, age, *args, city, job)   #args是变长参数,而city和job是命名关键字参数


​位置实参​​ ,需要实参的顺序与形参的顺序相同
当函数被调用时,如果没有传入对应的参数值,则使用默认值替代
函数返回多个参数值,可以用数组、元组、集合等返回

Python 支持参数通过地址传递,即通过传递对象的引用来实现参数传递。当你传递一个对象的引用(如指针、引用的实例或类对象)时,函数可以对对象的属性或状态进行更改,而不需要将整个对象作为返回值返回。
然而,Python 中的参数传递默认是值传递,而不是地址传递。当你在函数中传递一个参数时,Python 会创建一个该参数的副本,并将其传递给函数。这意味着,即使函数对参数进行了更改,这些更改也不会影响原始对象。
为了实现地址传递,你需要使用可变数据类型(如列表、字典、元组等),并将对象的引用作为参数传递给函数。这样,函数可以更改对象的属性或状态,而这些更改将反映在原始对象中。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7761545
  • 你也可以参考下这篇文章:使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
  • 你还可以看下python参考手册中的 python- 仅限关键字参数
  • 除此之外, 这篇博客: 使用Python爬取招聘数据、数据处理与可视化中的 使用词云展示工作地点情况 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 最后使用wordcloud库,绘制词云展示工作地点。

    from os import path
    from PIL import Image
    import matplotlib.pyplot as plt
    import jieba
    from wordcloud import WordCloud, STOPWORDS
    import pandas as pd
    import matplotlib.ticker as ticker
    import numpy as np
    import math
    import re
    
    df = pd.read_csv('intro_job.csv', encoding='utf-8-sig',usecols=["job", "company", "place", "salary", "date"])
    
    place_array = df['place'].values
    place_list = ','.join(place_array)
    with open('text.txt','a+') as f:
        f.writelines(place_list)
    
    ###当前文件路径
    d = path.dirname(__file__)
    
    # Read the whole text.
    file = open(path.join(d, 'text.txt')).read()
    ##进行分词
    #停用词,去除异地招聘的
    stopwords = ["异地","异地招聘","招聘"]
    text_split = jieba.cut(file)  # 未去掉停用词的分词结果   list类型
    
    #去掉停用词的分词结果  list类型
    text_split_no = []
    for word in text_split:
        if word not in stopwords:
            text_split_no.append(word)
    #print(text_split_no)
    
    text =' '.join(text_split_no)
    #背景图片
    picture_mask = np.array(Image.open(path.join(d, "path.png")))
    stopwords = set(STOPWORDS)
    stopwords.add("said")
    wc = WordCloud(  
        #设置字体,指定字体路径
        font_path=r'C:\Windows\Fonts\simsun.ttc',  
        background_color="white",   
        max_words=2000,   
        mask=picture_mask,  
        stopwords=stopwords)  
    # 生成词云
    wc.generate(text)
    
    # 存储图片
    wc.to_file(path.join(d, "result.jpg"))
    

    生成词云

  • 您还可以看一下 杨鑫老师的Python机器学习会员数据化运营课程中的 通过运营技能地图使用Python整理用户指标及订单跟踪小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    关于Python参数传递方式,Python不支持地址传递,其可变数据类型是引用传递。所谓传递引用,就是实际传递的是对象的引用,而不是对象的副本,也就是传递的是对象的地址。在函数内部对该可变对象的修改,会影响函数外部的这个对象。具体解释如下:

    Python的参数传递有两种情况:不可变数据类型和可变数据类型。

    对于不可变数据类型,如字符串、数字、元组等,函数内部对该参数的修改不会影响到函数外部的实参对象。原因是这些类型的对象是不可修改的,如果真的要修改,则会得到一个新的对象,而原来的对象并没有改变。因此,实参对象的值和形参的值并没有绑定在一起,所以修改形参的值并不影响实参。

    对于可变数据类型,如列表、字典等,函数内部对该参数的修改会影响到函数外部的实参对象。原因是这些类型的对象是可变的,所以形参的值会绑定到实参的对象上。函数内部对该可变对象的操作也会影响到实参对象,因为他们指向同一块内存地址。

    举个例子说明:

    def update_list(list):
        list[0] = 0
    
    myList = [1, 2, 3]
    update_list(myList)
    print(myList)  # [0, 2, 3]
    

    在update_list函数内部,我们修改了列表的第一个元素,修改后的结果显然会影响到函数外部的实参对象。所以print输出的结果为[0, 2, 3]。

    至于为什么Python不支持地址传递,个人理解是因为,地址传递需要直接访问内存地址,这与Python跨平台、动态解释执行、自动内存管理等特性相违背。因此,Python选择了引用来代替地址传递,保持了Python代码的“Pythonic”风格。