以下程序存在一个变量作用域的错误,请问错误在哪里,并给出修改方案


y = 8

def main():
    x = 4
    x = mystery(x + 1)
    print(y, s)

def mystery(x):
    s = 0
    for i in range(x):
        x = i + 1
        s = s + x
    return s

这段程序存在一个变量作用域的错误,具体表现为在函数main()中调用mystery()函数,但是mystery()函数中定义的变量s和i无法在main()函数中直接访问和使用。

解决方案是需要将mystery()函数中定义的变量s和i作为函数的返回值,然后将其作为参数传递给main()函数,实现数据共享和传递。

以下是修改后的程序代码:


y = 8

def main():
    x = 4
    s, i = mystery(x + 1)
    print(y, s)

def mystery(x):
    s = 0
    for i in range(x):
        x = i + 1
        s = s + x
    return s, i

main()

在这个修改过的程序中,mystery()函数返回了两个值s和i,main()函数接收这两个值,然后进行打印输出。通过这种方式,实现了数据的传递和共享。

s这个变量是在mystery申明的,所以其作用域只在mystery方法中起作用,因此不可以在main中使用s , mystery方法的返回值已经赋值给x了,因此,修改方案直接将s修改为x即可:
print(y, x)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7579359
  • 这篇博客也不错, 你可以看下猜数游戏续,当用户输入出错时给出“输入内容必须为整数”的提示,并让用户重新输入
  • 除此之外, 这篇博客: 虽然现在有可以去码的软件了,可视频是如何自动跟踪打码的?中的 部分代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    导入工具

    import cv2
    import face_recognition
    import matplotlib.pyplot as plt
    # %matplotlib inline # 在 jupyter 中使用的时候,去掉注释
    import ffmpy3
    import subprocess
    import os
    from PIL import Image

    图像处理,自动跟踪打码

    def mask_video(input_video, output_video, mask_path='mask.jpg'):
        # 打码图片
        mask = cv2.imread(mask_path)
        # 读取视频
        cap = cv2.VideoCapture(input_video)
        # 读取视频参数,fps、width、heigth
        CV_CAP_PROP_FPS = 5
        CV_CAP_PROP_FRAME_WIDTH = 3
        CV_CAP_PROP_FRAME_HEIGHT = 4
        v_fps = cap.get(CV_CAP_PROP_FPS)
        v_width = cap.get(CV_CAP_PROP_FRAME_WIDTH)
        v_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT)
        # 设置写视频参数,格式为 mp4
        size = (int(v_width), int(v_height))
        fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
        out = cv2.VideoWriter(output_video, fourcc, v_fps, size)

    已知人脸

     

    known_image = face_recognition.load_image_file("tmr.jpg")
    biden_encoding = face_recognition.face_encodings(known_image)[0]

    读取视频

    	cap = cv2.VideoCapture(input_video)
      while (cap.isOpened()):
          ret, frame = cap.read()
          if ret:
              # 检测人脸
              face_locations = face_recognition.face_locations(frame)
              # print(face_locations)
              # 检测每一个人脸
              for (top_right_y, top_right_x, left_bottom_y, left_bottom_x) in face_locations:
                  unknown_image = frame[top_right_y - 50:left_bottom_y + 50, left_bottom_x - 50:top_right_x + 50]
                  print(face_recognition.face_encodings(unknown_image))
                  if face_recognition.face_encodings(unknown_image) != []:
                      unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
    
                      # 对比结果
                      results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
                      # 是仝卓,就将打码贴图。
                      if results[0] == True:
                          mask = cv2.resize(mask, (top_right_x - left_bottom_x, left_bottom_y - top_right_y))
                          frame[top_right_y:left_bottom_y, left_bottom_x:top_right_x] = mask
              # 写入视频
              out.write(frame)
          else:
              break

     

    保存视频

    if __name__ == '__main__':
        # 将音频保存为cut.mp3
        video2mp3(file_name='cut.mp4')
        # 处理视频,自动打码,输出视频为output.mp4
        mask_video(input_video='cut.mp4', output_video='output.mp4')
        # 为 output.mp4 处理好的视频添加声音
        video_add_mp3(file_name='output.mp4', mp3_file='cut.mp3')

     

  • 您还可以看一下 王剑老师的站长必修课:网站是怎样做出来的?课程中的 网站备案小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    答案:

    问题分析:变量的值在函数内部无法被访问,这很可能是变量作用域的问题。在函数内部定义的变量默认为局部变量,只能在函数内部使用;而在函数外部定义的变量则为全局变量,可以在整个程序中使用。

    解决方案:可以通过以下一些方法来解决变量作用域的问题:

    1.将变量定义为全局变量:在函数外部定义变量,就可以在整个程序中使用了。

    var globalVar = "I am a global variable"; //定义一个全局变量
    
    function myFunction() {
      console.log(globalVar); //在函数中使用全局变量
    }
    
    myFunction(); //输出"I am a global variable"
    

    2.将变量作为函数的参数传递: 将需要在函数内部使用的变量作为参数传递给函数。

    function myFunction(myVar) {
      console.log(myVar); //在函数中使用传递的变量
    }
    
    var myVar = "I am a variable"; //定义一个变量
    
    myFunction(myVar); //输出"I am a variable"
    

    3.使用闭包:闭包可以创建私有变量,在函数内部也可以访问。

    function myFunction() {
      var myVar = "I am a private variable"; //定义一个私有变量
      return function() {
        console.log(myVar); //在返回的函数中使用私有变量
      }
    }
    
    var closureFunc = myFunction(); 
    closureFunc(); //输出"I am a private variable"
    

    以上是三种解决方案的示例代码,可以根据具体情况选择合适的方法来解决变量作用域问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^