2014-11-23 56 views
1

此代码无误地运行。但是在函数find_available_filenumber中,变量render_folder未被声明。所以我的问题是为什么这不会产生错误?为什么我的一个变量不需要声明而另一个呢?

如果我删除full_filename作为参数,我得到的错误:

UnboundLocalError: local variable 'full_filename' referenced before assignment. 

我不明白为什么这不也与render_folder发生,下面我的代码示例:

import bpy 
import os 

#Functions 
def find_available_filenumber(full_filename): 
    file_number = 1 

    while os.path.exists(render_folder + "\\" + full_filename): 
     file_number += 1 
     full_filename = create_full_filename(filename, file_number) 

    return file_number 

def create_full_filename(filename, file_number): 
    file_extension = ".avi" 
    full_filename = filename + "_" + str(file_number) + file_extension  

    return full_filename 

#Paths and names 
project_folder = "F:\\06_MotionPath_Dev\\" 
os.chdir(project_folder) 

render_folder = "Render\\QuickRenderAddon" 
filename = bpy.context.scene.name #Returns "QuickRenderAddon" 
full_filename = create_full_filename(filename, 1) 
filepath = render_folder + "\\" + full_filename 

available_number = find_available_filenumber(full_filename) 
print("Avail nmb: " + str(available_number)) 

回答

3

啊,是经典的“分配之前引用的”

我写了一些示例代码,显示是怎么回事。

test = "toast!" 
toast = "test!" 

def func(): 
    print test 
    print toast 

func() 

上面的输出是

toast! 
test! 

这表明,我们可以看到全局变量,但如何写呢?我不想'敬酒'做'测试!'不再是,而是“面包+烤面包机!”。让我们写出来。

test = "toast!" 
toast = "test!" 

def func(): 
    print test 
    toast = "bread+toaster!" 
    print toast 

func() 
print toast 

此输出

toast! 
bread+toaster! 
test! 

你会发现,我们能够打印出本地分配的变量,但是全局变量并没有改变。现在,我们来看另一个例子。

test = "toast!" 
toast = "test!" 

def func(): 
    print test 
    print toast 
    toast = "bread+toaster!" 
    print toast 

func() 
print toast 

这将引发错误

UnboundLocalError: local variable 'toast' referenced before assignment 

为什么?因为你稍后将变量'toast'声明为局部变量。 Python注意到这一点并停止代码以防止错误。稍后设置'toast'不会改变全局变量,而是在称为'toast'的函数内声明局部变量。

你如何解决这个问题?

第一是增加你的函数中的全局条款

test = "toast!" 
toast = "test!" 

def func(): 
    global toast 
    print test 
    print toast 
    toast = "bread+toaster!" 
    print toast 

func() 
print toast 

此输出

toast! 
test! 
bread+toaster! 
bread+toaster! 

您还可以修改您的代码放到一个类结构,因为这样的。

class bread(): 
    def __init__(self): 
     self.test = "toast!" 
     self.toast = "test!" 

    def func(self): 
     print self.test 
     print self.toast 
     self.toast = "bread+toaster!" 
     print self.toast 

b = bread() 
b.func() 

在我看来,类是最好的解决方案,因为它会增加模块性,并帮助您减少意大利面代码。

1

编辑:忽略我,我在手机上,所以我没有正确阅读。

错误状态“在赋值之前引用”。换句话说,在为它写入值之前,您正试图从该变量中读取一个值。

我有一种感觉,这个错误是因为你有条件的原因,因为你在写入while循环体之前检查这个值。

1

This code runs without errors. But in the function find_available_filenumber the variable render_folder isn't declared. So my question is why this doesn't produce an error?

这是因为render_folder在时间find_available_filenumber被称为声明,定义你的功能时,即使其未声明。

相关问题